2010-04-18 16 views
5

Etwas, das ich sehen ppl die Variable wie folgt definieren:Namenskonvention in Objective C/C, beginnen mit "_"?

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

statt

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

ich mit dem zweiten vertraut, aber nicht die erste. Also, Ich habe die Wikipedia über Namenskonvention:

Namen mit Doppelstrich beginnen oder einem Unterstrich und einem Großbuchstaben reserviert sind für die Umsetzung (Compiler, Standard-Bibliothek) und sollte nicht verwendet werden (zB __reserved oder _Reserved).

Also, ist das irgendeine spezielle Bedeutung, die mit "_" beginnt?

Der Code, den ich sah, das ist hier mit „_“ beginnen:

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

The wiki page.

Antwort

0

Normalerweise sind sie für Variablen verwendet, die sich außerhalb der aktuellen Datei zugegriffen werden soll nicht/module/namespace/was auch immer, in Sprachen, die keine Einschränkung des Zugriffs mit etwas wie einem private Stichwort

+0

Oder statisch in C. –

13

Es gibt eine lange Tradition unter einigen Objective-C-Entwickler zu pr Efix-Instanzvariablen mit einem Unterstrich. Es kann auf verschiedene Arten hilfreich sein: Erstens erleichtert es das Auffinden von Instanzvariablen in einer .m-Datei. Zweitens erleichtert es Entwicklern, kreative Namen für Methodenparameter zu erstellen, um Kollisionen mit Instanzvariablennamen zu vermeiden. und drei, wie andere angemerkt haben, gibt es an, dass die Instanzvariablen privat sind, und daher sollte nicht während des gesamten Codes auf Null zugegriffen werden.

In der Tat würde ich dafür argumentieren, den Zugriff auf Instanzvariablen direkt in anderen Methoden als Accessoren (Getter und Setter), -dealloc und -init... zu vermeiden. Nicht, dass Sie sie nie irgendwo anders verwenden sollten, aber Sie sollten zumindest darüber nachdenken, bevor Sie eine Instanzvariable direkt in anderen Methoden verwenden.

-1

Apple reserviert Namen, die mit Unterstrich für seine eigenen privaten Ivars und Methoden beginnen. In Objective-C auf jeder Apple-Plattform wird empfohlen, dass Sie Ihren Kennungen keinen Unterstrich voranstellen.

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

+0

-1 Apple * reserviert * keine Instanzvariablen mit vorangestellten Unterstrichen. Im Gegenteil, sie ermutigen alle Entwickler, Unterstrich-Präfixe für Ivars zu verwenden; Tatsächlich synthetisiert der in Xcode 4.5 eingeführte Autosynthesemechanismus standardmäßig voreingestellte Ivars. – jlehr

+0

@jlehr: Ihr letzter Punkt ist nicht wahr. Autosynthetisierte Ivars haben standardmäßig denselben Namen wie die Eigenschaft. –

+1

@ JeremyP: jlehr hat seinen früheren Standpunkt richtig. Ihr Link verweist auf einen Artikel über Benennungsmethoden, nicht auf Ivars. Der Ivar-zugehörige Begleiter kann hier gefunden werden: https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingIvarsAndTypes.html#//apple_ref/doc/uid/20001284-1001757 –

3

Es ist wirklich sehr hilfreich, aber die meisten Menschen wissen nicht, warum, und das ist eine Schande. Apple verwendet Unterstriche, um zu unterscheiden, wie andere Objekte auf die Variablen eines bestimmten Objekts zugreifen und wie ein bestimmtes Objekt auf seine eigenen Variablen zugreift. Nun, das mag ein wenig seltsam klingen, aber stellen Sie sich die folgenden: Sie alle wahrscheinlich die folgende Compiler erkennen

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

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

Warnung Diese in einer Compiler-Warnung zur Folge haben wird, weil es nicht, ob Sie auf die lokale Variable verweisen weiß "tableView" oder die Instanzvariable. Daher empfiehlt Apple, dass Sie das Folgende zu der Spitze Ihrer @ Implementierung hinzufügen.

@synthesize tableView = _tableView; 

Wenn Sie nun auf _tableView verweisen, weiß der Compiler, dass Sie das Instanz-Variable, und nicht die lokale eines bedeuten.

Auch das macht es viel einfacher, die Garbage Collection in Obj-C zu verstehen und häufige Fehler zu vermeiden.

Zum Beispiel, wenn Sie wie folgt vorgehen:

@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; 
} 

Jetzt, da Sie die Standard-Setter nicht verwenden (eigentlich kann man nicht, weil es schreibgeschützt ist) Sie Notwendigkeit das behalten verändere dich selbst. Dies ist viel einfacher zu merken, wenn Sie jeder Instanzvariable ein Präfix geben (damit Sie wissen, dass Sie es selbst behalten müssen).

Also, im Grunde ist es wichtig, den Unterschied zwischen self.variable und (_) variable zu verstehen. (Das heißt: self.variable Karten [self setVariable:...] und variable Karten direkt auf Ihrem Zeiger

Außerdem, wenn Sie es als eine private Variable hinzuzufügen, wie folgt aus:.

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

Der Unterstrich Präfix ist nicht wirklich notwendig, Es sei denn, Sie können auf lokale Variablen mit demselben Namen stoßen.Außerdem ist es auch eine einfache Möglichkeit, Sie daran zu erinnern, dass es sich um einen lokalen Zeiger handelt und Sie die Variable behalten und freigeben müssen, wenn Sie sie Ihrem Objekt zuweisen.

Was ist falsch ist, eine Eigenschaft mit einem Unterstrich Präfix zu erstellen, wie folgt aus:

@property (nonatomic, retain) NSString *_title; 

das wirklich falsch ist, und ich bin nicht einmal werde erklären, warum;)


Also ja! Sie sollten wirklich Unterstrichpräfixe verwenden, es macht Ihren Code viel einfacher zu lesen und durch den Compiler zu interpretieren! In Xcode 4 fügte Apple diese @synthesize s den Standardvorlagen hinzu.

0

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

beide von Übereinkommen und die Empfehlung in dem obigen Dokument, sollten Sie ivars mit einem Unterstrich voranstellen.

Zugegeben, es bezieht sich auf explizit festgelegte Ivars für Eigenschaften.

Aber die Verwendung ist die gleiche, um die Verwendung eines ivar anzuzeigen, wo auch immer es gesehen wird.

Ich bin jedoch offen für die Möglichkeit, dass in diesem Zusammenhang die Verwendung eines Unterstrichs mit vorangestelltem ivar dem Benutzer signalisieren könnte, dass sie etwas falsch machen. Unterdessen könnte ein postfixed Unterstrich für reine Ivars verwendet werden, die direkt angesprochen werden sollen.

Dieser Blog hat einige gute Gedanken von einem erfahrenen Praktiker und empfiehlt die Verwendung von Präfix-Unterstrichen.

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

Wether Sie wählen Präfix Unterstrichen verwenden, um Ihre eigene ivars zu dekorieren, gibt es zumindest einige Hinweise darauf, dass irgendeine Art von Dekoration Sie Fehler vermeiden helfen. Und Präfix-Unterstriche sind die gebräuchlichste Dekoration.