2010-07-13 19 views
11

Sto cercando di capire le proprietà Objective-C e ho alcune domande persistenti sulla loro sintassi.Dichiarazione di proprietà e allocazione automatica del backup di supporto

Qual è la differenza tra dichiarando esplicitamente un Ivar per una proprietà come questa:

@interface myObject1 : NSObject { 
    NSString *title; 
} 
@property (copy) NSString *title; 
@end 

e questo:

@interface myObject2 : NSObject { 
} 
@property (copy) NSString *title; 
@end 

L'esempio myObject2 sembra funzionare. È corretto implementare le proprietà come in myObject2 o l'ivar associato deve essere sempre definito in modo esplicito?

Quali sono le conseguenze di non dichiarare esplicitamente l'ivar?

+0

Ci scusiamo per la confusione, a causa di per lo più facendo OSX a 32 bit, mi sembra di dimenticare regolarmente ciò che ha pubblicato Louis. –

risposta

13

Sul moderno runtime Objective C (nonfragile-abi) sono gli stessi, il backup di ivar verrà creato automaticamente dalla dichiarazione @synthesize. Questo è il runtime utilizzato da iPhone e app Mac OS X a 64 bit. Mac OS X a 32 bit usa il runtime legacy, dove non è possibile sintetizzare l'ivar, e il secondo bit di codice che hai scritto non sarebbe stato compilato correttamente.

Le versioni più recenti del simulatore iPhone utilizzano il runtime moderno, mentre quelle più vecchie no. Quindi, mentre entrambi gli esempi di codice funzioneranno effettivamente su iPhone (sintetizzando la memoria necessaria), il secondo esempio non riuscirà a compilare il simulatore a meno che non si disponga di un Xcode aggiornato.

+0

Quindi c'è qualche svantaggio di non dichiarare esplicitamente la variabile di supporto (a parte i problemi di incompatibilità con compilatori/simulatori più vecchi che hai citato)? – Avalanchis

+0

Con i compilatori attuali, no, lì Le cose sono un po 'più complicate se state usando le build di sviluppo di Clang e accendete i sintetizzatori automatici (-nonfragile-abi2), ma non mi preoccuperei di questo genere di cose. –

+0

Grazie così tanto. Penso che la mia confusione fosse dovuta principalmente al fatto che non mi ero reso conto che si trattava di una caratteristica linguistica relativamente nuova, quindi non era chiaro il motivo per cui si desidera dichiarare esplicitamente l'ivar per una proprietà semplice se non fosse necessario. – Avalanchis

2

Con il runtime moderno sono gli stessi (come già accennato) tranne per il fatto che gli ivars che non sono definiti esplicitamente come in MyObject1 non verranno visualizzati nel debugger quando si visualizzano le variabili o si passa il mouse sopra le variabili, devi stampare i valori delle variabili o impostare il riepilogo della variabile nella vista delle variabili per visualizzare le proprietà.

ho iniziato ad usare il modo MyObject2 di fare le cose a causa della digitando meno ma è più fastidioso dover digitare nella riga di comando gdb per visualizzare lo stato variabile nel debugger :(

Problemi correlati