Quando fai un trattino di sottolineatura davanti a una variabile di istanza?

Possibile duplicato:
Come funziona una sottolineatura di fronte a una variabile in un lavoro di c-class objective-c?

L’ho visto su Apple, all’interno di UIPickerView.h:

id _dataSource; 

perché quel segno di sottolineatura lì? Ha un significato speciale? Una convenzione che devo sapere?

Molte persone usano questo per variabili private, per distinguere tra variabili private e variabili pubbliche all’interno di un object.

È un modo di lavorare completamente opzionale.

Quello che stai vedendo è l’uso di sottolineatura per distinguere tra variabili di istanza e proprietà. Quindi una dichiarazione di class potrebbe essere:

 @interface Foo { NSString* _label; .... } @property (nonatomic, retain) NSString* label; // notice: no underline 

Quindi nel file di implementazione avresti:

 @synthesize label=_label; // the property is matched with the ivar 

Ora, quando ci si trova all’interno dell’implementazione, se si desidera accedere direttamente alla variabile di istanza si può semplicemente usare _label ma per passare attraverso i metodi di accesso alla proprietà (che si occupano di conservare / rilasciare e una serie di altri compiti di conservazione dei libri) si useranno da self.label . Dall’esterno, si vorrebbe sempre passare attraverso la proprietà {object}.label .

L’altro modo è di fare a meno della sottolineatura e basta usare:

 NSString* label; @property (nonatomic, retain) NSString* label; ... @synthesize label; 

Funziona allo stesso modo, ma potrebbe confondere qualcuno leggendo il codice e cercando di tenere traccia di label vs self.label . Personalmente trovo la convenzione Apple (con sottolineatura) un po ‘più facile da leggere, ma è una questione di preferenza.

Come diceva la gente, già si diceva che qualcuno era una variabile privata. Era una questione semplice di convenzione e non importava davvero.

Un altro uso, fare un viaggio nella macchina del wayback in C a _function () rappresentava una funzione che non era piattaforma portatile e __function () rappresentava una funzione che non era un compilatore portabile. Quindi, nella libreria C standard, a volte vedrai una variabile con un _ o __ di fronte al nome, questo è ciò che rappresentano queste funzioni.

A volte è usato per denotare variabili private. Più in generale significa semplicemente “questa variabile è diversa in qualche modo”.

può essere così … (jogging memory) …

Ricordo vagamente di aver letto un documento dell’ADC che spiega che Apple riserva l’uso di variabili membro con prefisso sottolineato? e che gli sviluppatori di terze parti sono scoraggiati dall’usare questa convenzione in modo da evitare collisioni?

| K <

Uso i caratteri di sottolineatura per indicare che una variabile è un membro, simile al prefisso ‘m’ nella notazione ungherese (che notazione scrivo a fondo, ma questa è un’altra storia). Certo, in questi giorni ottieni editor di codifica a colors, ma la mia opinione è che il prefisso ti fa pensare alla variabile come membro / istanza prima che tu la digiti, non solo qualche volta dopo quando viene codificata con il colore dal tuo editor.

In genere è per indicare che una variabile non deve essere direttamente toccata da uno sviluppatore. Non è davvero un requisito, ma è una buona pratica se non puoi evitare di avere una variabile pubblica in una class che non vuoi incasinare.

Ho scelto di utilizzare i caratteri di sottolineatura per ivars perché mi capita spesso di incontrare la seguente situazione:

 @interface MyClass:NSObject { NSUInteger count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ self.count = count; // Parameter name collides with ivar name! } return self; } @end 

Quindi faccio questo:

 @interface MyClass:NSObject { NSUInteger _count; } @property(nonatomic) NSUInteger count; -(id) initWithCount(NSUInteger) count; @end (...) @implementation MyClass @synthesize count = _count; -(id) initWithCount(NSUInteger) count { if((self = [super init])){ _count = count; // No name collision } return self; } @end 

Ovviamente, potrei alternativamente cambiare il nome del parametro in “newCount” o “aCount” (lo odio). Penso che sia una questione di gusti.