@property
definisce un'interfaccia, non un'implementazione. Nel tuo caso, stai definendo una proprietà di readwrite. Ciò significa che stai promettendo di implementare -myObject
e -setMyObject:
. Questo non ha nulla a che fare con gli ivar.
Ora, il modo più comune per implementare questi metodi è farli essere sostenuti da un ivar. Per comodità, ObjC ti consente di generare automaticamente i metodi richiesti con un negozio di ivar usando @synthesize myObject=myObject_;
Questo dice "crea i metodi richiesti per la proprietà myObject
usando un ivar creato automaticamente chiamato myObject_
". L'ivar myObject_
è un vero ivar e puoi accedervi normalmente (anche se generalmente non dovresti, dovresti usare gli accessor).
Invece di utilizzare @synthesize
, è possibile implementare solo -myObject
e -setMyObject:
. Si potrebbe anche usare @dynamic myObject;
per dire al compilatore "non preoccuparti delle implementazioni per questa proprietà, verrà gestito correttamente in fase di esecuzione".
Ci sono alcune differenze tra @property
e metodi appena dichiarano, ma in linea di principio, questa linea:
@property (nonatomic, readwrite, strong) MyObject* myObject;
è concettualmente lo stesso di questo:
- (MyObject *)myObject;
- (void)setMyObject:(MyObject *)anObject;
Dichiarare l'Ivar da soli non ha impatto reale qui. Devi ancora implementare i metodi in qualche modo. Se il tuo ivar denominato è lo stesso di ivar @synthesize
utilizzato, allora @synthesize
non creerà un nuovo ivar.
Come pratica, scoraggio le persone dal dichiarare gli avari più. Raccomando solo l'uso di proprietà pubbliche e private con @synthesize
per creare eventuali ivars necessari. Se per qualche motivo devi avere un ivar manuale, ti consiglio di dichiararli nel blocco @implementation
anziché nello @interface
.
fonte
2012-01-30 14:59:32
E qual è la tua domanda? –