2012-01-30 16 views
7

In Obj-c quando dichiara una variabile all'interno @interfaceinterfaccia obiettivo-c - dichiarazione della variabile vs solo proprietà?

@interface: NSObject { MyObject * myObject}

@property (non sicuro, atomici) MyObject * myObject;

vs. Solo dichiararla come una proprietà

@interface: NSObject {}

@property (non sicuro, nonatomic) MyObject * myObject; @end

Non si dichiara alcun var qui?

Saluti Christian

+3

E qual è la tua domanda? –

risposta

10

@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.

9

Saltare dichiarando l'Ivar è perfettamente bene - ma non sarà in grado di vedere il valore del Ivar nel Xcode IDE. Un giorno Apple potrebbe risolvere il problema.

Sarà possibile "po" l'ivar per ispezionarlo in GDB o lldb.

+0

+1 per quello - ho giurato molto al debugger ultimamente, non mi è venuto in mente che dichiarare l'ivar avrebbe reso le mie cose visibili al debugger! –

+0

Segnala una segnalazione di bug con Apple: bugreport.apple.com – zaph