2010-04-18 2 views
5

qualcosa che vedo ppl definiscono la variabile in questo modo:Convenzione di denominazione in Objective C/C, inizia con "_"?

b2World *_world; 
b2Body *_body; 
CCSprite *_ball; 

invece di

b2World *world; 
b2Body *body; 
CCSprite *ball; 

ho familiarità con la seconda, ma non il primo. Così, ho controllato il Wikipedia convenzione di denominazione:

Nomi che cominciano con doppia sottolineatura o un underscore e una lettera maiuscola sono riservati per l'attuazione (compilatore, libreria standard) e non deve essere utilizzato (ad esempio __reserved oppure _Reservato).

Quindi, è tutto un significato speciale che inizia con "_"?

Il codice ho visto che l'utilizzo di "_" per iniziare è qui:

http://www.raywenderlich.com/457/intro-to-box2d-with-cocos2d-tutorial-bouncing-balls

The wiki page.

risposta

0

Di solito sono utilizzati per le variabili che non devono essere accessibili al di fuori del file corrente/modulo/spazio dei nomi/quant'altro, in lingue che non supportano restrizioni di accesso con qualcosa come una parola chiave private

+0

Oppure statico in C. –

13

C'è una convenzione di vecchia data tra alcuni sviluppatori di Objective-C per pr variabili di istanza efix con un carattere di sottolineatura. Può essere utile in diversi modi: uno, rende più facile individuare le variabili di istanza in un file .m; due, allevia gli sviluppatori di dover inventare nomi creativi per i parametri del metodo per evitare di scontrarsi con i nomi delle variabili di istanza; e tre, come altri hanno notato, indicano che le variabili di istanza sono private, e quindi non dovrebbero essere consultate su tutto il codice.

In effetti, direi di non accedere alle variabili di istanza direttamente in metodi diversi da accessor (getter e setter), -dealloc e -init.... Non che non dovresti mai, mai e poi mai usare altrove, ma dovresti almeno pensarci prima di usare una variabile di istanza direttamente in altri metodi.

-1

Apple si riserva i nomi che iniziano con il trattino di sottolineatura per i propri metodi e ivars privati. In Objective-C su qualsiasi piattaforma Apple, si consiglia di non anteporre i propri identificatori con un carattere di sottolineatura.

http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html

+0

-1 Apple * non * riserva variabili di istanza precedute da caratteri di sottolineatura. Al contrario, incoraggiano tutti gli sviluppatori a usare prefissi di sottolineatura per ivars; infatti, il meccanismo di autosintesi introdotto in Xcode 4.5 sintetizza per impostazione predefinita gli ivars prefissati. – jlehr

+0

@jlehr: il tuo ultimo punto non è vero. I predefiniti autosintesi hanno lo stesso identico nome della proprietà per impostazione predefinita. –

+1

@JeremyP: jlehr ha ragione sul suo precedente punto. Il tuo link rimanda a un articolo sui metodi di denominazione, non su ivars. L'accompagnatore di ivar può essere trovato qui: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757 –

3

E 'davvero molto utile, ma la maggior parte della gente non sa perché, e questo è un peccato. Apple utilizza i caratteri di sottolineatura per separare il modo in cui altri oggetti accedono alle variabili di un particolare oggetto e il modo in cui un particolare oggetto accede alle proprie variabili. Ora, questo può sembrare un po 'strano, ma immaginate quanto segue: Probabilmente tutti riconosciamo il seguente avviso del compilatore

.h 
@property (nonatomic, retain, readonly) UITableView *tableView; 

.m 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [self loadSomethingElseForTableView:tableView]; 
} 

Questo si tradurrà in un avviso del compilatore, perché non sa wether si fa riferimento alla variabile locale "tableView" o la variabile di istanza. Pertanto, Apple consiglia di aggiungere quanto segue all'inizio di @implementation.

@synthesize tableView = _tableView; 

Ora, quando si fa riferimento al _tableView, il compilatore sa che vuoi dire la variabile di istanza, e non quello locale.

Inoltre, questo rende molto più facile capire la Garbage Collection in Obj-C, e per evitare di commettere errori comuni.

Per esempio, quando si fa la seguente:

@property (nonatomic, retain, readonly) NSString *title; 

- (id)initWithTitle:(NSString *)title { 
    if ((self = [super init])) { 
     self.title = title; // Is not possible, since it's read only. 
     title = title; // Is not possible, since it's the same (local) variable. 
     // Changing the method to initWithTitle:(NSString *)aTitle; 
     title = aTitle; 
    } 
    return self; 
} 

Ora, dal momento che non si utilizza il setter di default (in realtà, non è possibile, perché è di sola lettura) si necessità di mantenere la variabile te stesso. Questo è molto più facile da ricordare quando assegni a ogni variabile di istanza un prefisso (quindi sai che devi mantenerlo tu stesso).

Quindi, in sostanza, è importante capire la differenza tra self.variable e (_) variable. (Vale a dire: self.variable mappe a [self setVariable:...] e variable mappe direttamente al puntatore

Inoltre, quando si aggiunge come una variabile privata, in questo modo:.

@interface TSSomeObject : NSObject { 
@private 
    NSString *_privateTitle; 
} 
@end 

Il prefisso di sottolineatura non è realmente necessario, a meno che tu non incontri le variabili locali che hanno lo stesso nome, oltre a questo, ancora, è anche un modo semplice per ricordarti che si tratta di un puntatore locale e che devi conservare (e rilasciare) la variabile quando la assegni al tuo oggetto.

Che cosa è sbagliato è quello di creare una proprietà con un prefisso di sottolineatura, come questo:

@property (nonatomic, retain) NSString *_title; 

che è davvero sbagliato, e io non sono nemmeno intenzione di spiegare perché;)


Quindi sì! Dovresti davvero usare i prefissi di sottolineatura, rende il tuo codice molto più facile da leggere e da interpretare dal compilatore! In Xcode 4, Apple ha persino aggiunto questi @synthesize ai modelli predefiniti.

0

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757

Sia per convenzione e la raccomandazione nel documento di cui sopra, si dovrebbe anteporre ivars con un carattere di sottolineatura.

Certamente, è in riferimento all'impostazione esplicita di ivars per le proprietà.

Ma l'uso è lo stesso, per indicare l'uso di un ivar ovunque sia visto.

Sono tuttavia aperto alla possibilità, che in tale contesto, l'uso di un trattino di sottolineatura prefisso potrebbe segnalare all'utente che stanno facendo qualcosa di sbagliato. Nel frattempo potrebbe essere usato un trattino di sottolineatura postfissa per ivar puri a cui si intende accedere direttamente.

Questo blog ha alcuni buoni pensieri da un professionista esperto e raccomanda l'utilizzo di caratteri di sottolineatura prefissati.

http://blog.bignerdranch.com/463-a-motivation-for-ivar-decorations/

Sia che sceglie di utilizzare underscore prefissati per decorare i propri Ivars, c'è almeno qualche evidenza che un qualche tipo di decorazione vi aiuterà a evitare i bug. E i prefissi prefissati sono la decorazione più comune.