2012-02-22 15 views
27

Se ho capito bene, copy impone al setter di creare una copia dell'oggetto passato. Tuttavia, se lo uso insieme a readonly, non ci sarà un setter. Quindi la mia ipotesi è corretta, che la combinazione di @property (copy, readonly) non ha alcun senso o mi manca qualcosa?La copia di @property in combinazione con readonly ha senso?

+0

Buona domanda, mi chiedo se il tag 'readonly' rende il setter solo un metodo privato, quindi eseguirà comunque una copia quando lo si imposta all'interno della classe stessa? cioè 'self.myProperty = newThing;' –

+0

Doc Apple ha questo però: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/ uid/TP30001163-CH17-SW19 – kennytm

risposta

25

Ha senso. Ad esempio, se si desidera accedere setter di una proprietà nella implementazione solo:

@interface MyClass : NSObject 
@property (nonatomic, copy, readonly) NSData *data; 

- (id)initWithData:(NSData *)data; 

@end 

e nella continuazione classe nel file .m:

@interface MyClass() 
@property (nonatomic, copy, readwrite) NSData *data; 
@end 

Nota che la dichiarazione copy, readonly nell'intestazione pubblico è richiesto in questo caso!

+4

Stesse considerazioni si applicano se una sottoclasse vuole ridichiarare una proprietà 'readonly' definita nella superclasse come' readwrite' nella propria implementazione. – Monolo

+1

Questo è un caso speciale piuttosto raro nella mia esperienza, eppure hai completamente ragione (entrambi), in questo caso molto speciale si ha bisogno di 'copia' anche per una proprietà di sola lettura. – Mecki

-1

Hai ragione, non ha senso avere entrambi.

11

Secondo Apple's documentation (che ho linkato qui per voi):

copy
Specifica che una copia dell'oggetto deve essere utilizzata per l'assegnazione.

Il valore precedente viene inviato un messaggio release.

La copia viene effettuata mediante il richiamo del metodo copy. Questo attributo è valido solo per i tipi di oggetto, che devono implementare il protocollo NSCopying.

Quindi sì, siete sulla strada giusta ... readonly crea un metodo getter e copy sarebbe effettivamente ignorato, dal momento che non c'è nessun metodo setter che fa assegnazione.

+0

Questa dovrebbe essere la risposta accettata ... come in realtà _answers_ la domanda, lol. –

-2

Penso che, se avessi visto una tale proprietà, in lettura, mi sarei aspettato di ricevere un oggetto restituito distinto per l'ivar a meno che l'oggetto restituito fosse pubblicizzato come immutabile.

Se ho

@property (readonly, copy) NSMutableArray* foo; 

e faccio questo:

NSMutableArray* myFoo = [theObject foo]; 
[myFoo addObject: @"string"]; 
NSMutableArray* myOtherFoo = [theObject foo]; 

mi aspetterei myOtherFoo non avere la corda in più in esso che ha myFoo.

Nota: non ho ancora verificato questo.

L'ho controllato ora e la mia aspettativa non è corretta. Penso che lo considererei un bug.

+0

L'annotazione "copia" significa copia su serie, non copia su ricevitore. –

+0

@HotLicks err, sì, lo so. Non hai letto le ultime due righe della mia risposta? Personalmente, lo considero ancora un bug. – JeremyP

+0

Perché dovresti prevedere di modificare l'oggetto e non avere la modifica visibile? Due accessi della proprietà "pippo" recupereranno entrambi i riferimenti allo stesso oggetto. –

Problemi correlati