Qual è il modo migliore per utilizzare le proprietà Obj-C 2.0 con oggetti mutabili, come NSMutableArray?

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

Domanda

Ho una classe Obj-C 2.0 che ha una proprietà NSMutableArray. Se uso il seguente codice, il setter sintetizzato mi darà una copia immutabile, non mutabile:

@property (readwrite, copy) NSMutableArray *myArray;

C'è qualche motivo per cui Apple non ha implementato la seguente sintassi?

@property (readwrite, mutablecopy) NSMutableArray *myArray;

Dato che non abbiamo mutablecopy , qual è il modo migliore per gestire questa situazione (apparentemente comune)? Devo solo scrivere il mio setter che fa un -mutableCopy?

È stato utile?

Soluzione

Come detto prima, il modo giusto di farlo non è di rendere la matrice mutabile una proprietà. C'è una grande spiegazione di cosa dovresti implementare per essere conforme a KVC qui .

Altri suggerimenti

Qualche tempo fa ho riscontrato lo stesso problema e ho trovato un documento su Apple Developer Connection che consiglia di fornire la propria implementazione del setter. Esempio di codice dal documento collegato:

@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];
    }
}

Non è comune passare NSMutableArray in Cocoa. La pratica standard del cacao consisterebbe nell'implementare la codifica valore-chiave conforme a metodi per una proprietà indicizzata a molti. Questo ha due vantaggi:

  1. L'osservazione del valore-chiave funziona come previsto (ci sono diversi casi in cui l'osservazione di un NSMutableArray porta a comportamenti non-ciò-che-vuoi)
  2. L'implementazione della struttura dei dati è nascosta perché si espongono i metodi di mutazione (ad es. - [MyObject insertObjectInMyProperty: (id) newObject atIndex: (NSUInteger) i] , non la struttura stessa dei dati.

Tieni presente che passare intorno a un array mutabile non è in realtà una pratica comune in Cocoa. È possibile utilizzare un array mutabile privato come memoria interna, ma creare metodi utilizzando semplici oggetti NSArray per aggiungere o estrarre oggetti da esso. Questo potrebbe essere il motivo per cui non esiste una dichiarazione di proprietà di mutablecopy.

Dovrai scrivere il tuo setter.

Il modo giusto di aggrapparsi a un NSMutableArray è con una proprietà keep:

@property (nonatomic, retain) NSMutableArray *myArray;

Non è necessario scrivere il proprio setter o utilizzare la copia. La proprietà copy dovrebbe essere usata con un NSArray che in realtà deve essere copiato quando la proprietà viene acquisita in un altro oggetto. Ad esempio, se assegni un oggetto NSMutableArray a una proprietà che è di tipo NSArray con la proprietà copy, allora vuoi fare una copia dell'array mutabile per " capture " da quel momento in poi come proprietà immutabile.

E Marc ha l'approccio giusto, normalmente non si renderebbe NSMutableArray una parte dell'API pubblica dei propri oggetti. Se hai una proprietà pubblica, può essere un NSArray con la proprietà copy.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top