Was ist der beste Weg, Obj-C 2.0 Eigenschaften mit veränderbaren Objekten zu verwenden, wie NSMutableArray?

StackOverflow https://stackoverflow.com/questions/816720

Frage

Ich habe eine Obj-C 2.0-Klasse, die eine NSMutableArray Eigenschaft hat. Wenn ich den folgenden Code verwenden, dann die synthetisierte Setter gibt mir eine unveränderliche Kopie, kein wandelbar ein:

@property (readwrite, copy) NSMutableArray *myArray;

Gibt es einen Grund, dass Apple hat die folgende Syntax nicht umsetzen?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Da wir mutablecopy nicht haben, was ist der beste Weg, um diese (scheinbar üblich) Situation zu umgehen? Soll ich meinen eigenen Setter nur schreiben, die eine -mutableCopy das?

War es hilfreich?

Lösung

Wie gesagt, die richtig , es zu tun ist nicht die änderbare Array einer Eigenschaft zu machen. Es gibt eine große Erklärung, was Sie implementieren sollten KVC kompatibel sein hier .

Andere Tipps

Ich lief in das gleiche Problem vor einiger Zeit und fand ein Dokument auf der Developer Connection Apple- empfehlen eine eigene Implementierung der Setter zu liefern. bilden Codebeispiel das verknüpfte Dokument:

@interface MyClass : NSObject {
    NSMutableArray *myArray;
}
@property (nonatomic, copy) NSMutableArray *myArray;
@end

@implementation MyClass

@synthesize myArray;

- (void)setMyArray:(NSMutableArray *)newArray {
    if (myArray != newArray) {
        [myArray release];
        myArray = [newArray mutableCopy];
    }
}

Es ist nicht üblich NSMutableArrays in Cocoa laufen um. Standard Cocoa Praxis wäre der Schlüssel-Wert-Codierung konform Methoden für eine indizierte to-many-Eigenschaft. Dies hat zwei Vorteile:

  1. Key-Wert zu beobachten funktioniert wie erwartet (es gibt mehrere Fälle, in denen ein NSMutableArray Beobachtung führt zu nicht-what-you-want-Verhalten)
  2. Die Umsetzung Ihrer Datenstruktur ist versteckt, weil Sie mutieren Methoden aussetzen (z -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i], nicht die Datenstruktur selbst.

Beachten Sie, dass um einen änderbaren Array vorbei ist nicht wirklich eine gängige Praxis in Cocoa. Sie könnten ein eigenes änderbaren Array als interne Speicher verwenden, sondern erstellen Methoden Ebene NSArray Objekte mit Objekten hinzufügen oder aus ihm heraus. Dies kann, warum gibt es keine mutableCopy Eigenschaft Erklärung an.

Sie müssen Ihren eigenen Setter schreiben.

Der richtige Weg zu einem NSMutableArray zu halten, ist mit einer Retain Eigenschaft:

@property (nonatomic, retain) NSMutableArray *myArray;

Sie müssen keine eigenen Setter oder Verwendung Kopie zu schreiben. Die Kopie Eigenschaft sollte mit einem NSArray verwendet werden, die kopiert braucht eigentlich, wenn die Eigenschaft in ein anderes Objekt erfasst wird. Zum Beispiel, wenn Sie ein NSMutableArray-Objekt auf eine Eigenschaft zuweisen, die mit der Kopie-Eigenschaft vom Typ NSArray ist, dann wollen Sie von diesem Zeitpunkt an eine Kopie des änderbaren Array „einzufangen“ es als unveränderliche Eigenschaft machen.

Und Marc hat den richtigen Ansatz, würde man normalerweise nicht ein Teil der öffentlichen API Ihrer Objekte machen NSMutableArray. Wenn Sie ein öffentliches Eigentum zu tun haben, kann es eine NSArray mit der Kopie Eigenschaft sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top