2009-05-03 7 views
12

Ho una classe Obj-C 2.0 con proprietà NSMutableArray. Se uso il seguente codice, quindi il setter sintetizzato mi darà una copia immutabile, non mutabile uno:Qual è il modo migliore di utilizzare Proprietà Obj-C 2.0 con oggetti mutabili, come NSMutableArray?

@property (readwrite, copy) NSMutableArray *myArray; 

C'è qualche ragione per cui Apple non ha attuato la seguente sintassi?

@property (readwrite, mutablecopy) NSMutableArray *myArray; 

Dal momento che non abbiamo mutablecopy, qual è il modo migliore per gestire questa situazione (apparentemente comune)? Dovrei semplicemente scrivere il mio setter che fa un -mutableCopy?

risposta

4

Come detto prima, il modo giusto per farlo è quello di non fare la matrice mutabile una proprietà. C'è una grande spiegazione di ciò che si dovrebbe implementare per essere compatibile con KVC here.

+0

In questa risposta http://stackoverflow.com/a/14814973/104790 presento una soluzione che espone le collezioni mutabili senza interrompere l'incapsulamento. La risposta non è adatta per questa domanda qui perché è solo per proprietà 'readonly'. –

+0

Il collegamento non è attivo .. – Krishnan

+0

Come ha detto @Krishnan, il collegamento non funziona più.:-( –

1

Dovrai scrivere il tuo setter.

14

Mi sono imbattuto nello stesso problema qualche tempo fa e ho trovato un document on the Apple Developer Connection che consigliava di fornire la propria implementazione del setter. Esempio di codice del 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]; 
    } 
} 
3

Ricordare che passare un array mutabile non è una pratica comune in Cocoa. È possibile utilizzare un array mutable privato come storage interno, ma creare metodi usando oggetti NSArray semplici per aggiungere o ottenere oggetti da esso. Questo potrebbe essere il motivo per cui non esiste una dichiarazione di proprietà mutablecopy.

5

Non è comune passare circa NSMutableArray s in Cocoa. La pratica standard del cacao consisterebbe nell'implementare il codice di codifica del valore-chiave methods per una proprietà indicizzata su molti. Questo ha due vantaggi:

  1. chiave-valore opere osservando come previsto (ci sono diversi casi in cui osservando un NSMutableArray porta a non-what-you-want comportamento)
  2. L'implementazione della struttura dei dati è nascosto perché si espone mutando metodi (ad esempio -[MyObject insertObjectInMyProperty:(id)newObject atIndex:(NSUInteger)i], non la struttura dati stessi.
0

Il modo giusto per tenere su di un NSMutableArray è con una proprietà trattenere:

@property (nonatomic, retain) NSMutableArray *myArray; 

Non è necessario scrivere il proprio setter o l'uso di copia. La proprietà copy deve essere utilizzata 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 "catturarlo" come proprietà immutabile da quel punto in avanti.

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