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?
risposta
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!
Stesse considerazioni si applicano se una sottoclasse vuole ridichiarare una proprietà 'readonly' definita nella superclasse come' readwrite' nella propria implementazione. – Monolo
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
Hai ragione, non ha senso avere entrambi.
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 protocolloNSCopying
.
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.
Questa dovrebbe essere la risposta accettata ... come in realtà _answers_ la domanda, lol. –
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.
L'annotazione "copia" significa copia su serie, non copia su ricevitore. –
@HotLicks err, sì, lo so. Non hai letto le ultime due righe della mia risposta? Personalmente, lo considero ancora un bug. – JeremyP
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. –
- 1. NSString @property, usando la copia invece di conservare
- 2. La variabile statica constexpr ha senso?
- 3. Ha senso usare la parola chiave inline con i modelli?
- 4. in_array non ha senso
- 5. Quando Thread.CurrentThread.Join() ha senso?
- 6. Che senso ha specificare hibernate.jdbc.batch_size?
- 7. Perché la fissione del loop ha senso in questo caso?
- 8. Ha senso utilizzare un pool di attori?
- 9. Ha senso sovrascrivere un metodo in un'interfaccia
- 10. Scala: l'opzione [Booleano] ha senso?
- 11. Questa espressione Python ha senso?
- 12. iniezione Property di attributi
- 13. Rilascio di variabili di istanza di @property (copia)?
- 14. Ha senso verificare automaticamente null in Java
- 15. Quando JavaScript == ha più senso di ===?
- 16. generatore di greenDAO dà errore console che non ha senso
- 17. Resharper 4.5 ha interrotto la mia combinazione di colori
- 18. Perché la combinazione di Maven con Git?
- 19. Ha senso usare std :: uninitialized_fill() con qualsiasi allocatore?
- 20. Ha senso utilizzare un indice con una cardinalità bassa?
- 21. L'utilizzo delle migrazioni con Rails/Mongoid/MongoDB ha senso?
- 22. Cosa fa .property()? in function() {}. property()
- 23. La query media min/max-larghezza non ha senso grammaticale
- 24. La dimensione massima del set residente non ha senso
- 25. In che modo questa risoluzione di sovraccarico ha senso?
- 26. Un sistema misto .net/sap ha senso?
- 27. Risultato Ripetibilità Opencv non ha senso?
- 28. readonly con jquery
- 29. Ha senso integrare il backbone.js con ASPNET MVC?
- 30. Python: @staticmethod con @property
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;' –
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