2009-05-07 5 views
30

Mögliche Duplizieren:
How does an underscore in front of a variable in a cocoa objective-c class work?Wann machen Sie einen Unterstrich vor einer Instanzvariablen?

ich das bei Apple gesehen habe, innen UIPickerView.h:

id<UIPickerViewDataSource> _dataSource; 

warum die, die dort unterstreichen? Hat es eine besondere Bedeutung? Ein Übereinkommen, über das ich Bescheid wissen muss?

+3

http://stackoverflow.com/questions/822487/how-does-andunderscore-in-front-of-a-variable-in-a-cocoa-objective-c-class-work – Chuck

Antwort

34

Viele Leute verwenden dies für private Variablen, um zwischen privaten Variablen und öffentlichen Variablen innerhalb eines Objekts zu unterscheiden.

Es ist eine völlig optionale Art zu arbeiten.

+24

Apple behält Variablen beginnend mit _ für eigene Zwecke. Tu es nicht. –

+2

Ich würde +1 gs Kommentar wenn ich könnte. – Abizern

+0

@gs (oder Abizern): Haben Sie eine Referenz dafür? Ich weiß, dass der Compiler den C-Standardnamen mangling verwendet, der einen Unterstrich hinzufügt, aber das hindert Sie nicht daran, dies auch in Ihrer eigenen Codebasis zu tun ... –

2

Es wird manchmal verwendet, um private Variablen zu bezeichnen. Allgemeiner bedeutet es nur "diese Variable ist irgendwie anders".

1

Im Allgemeinen bedeutet dies, dass eine Variable nicht direkt von einem Entwickler berührt werden sollte. Es ist nicht wirklich eine Voraussetzung, aber es ist eine gute Übung, wenn Sie nicht vermeiden können, eine öffentliche Variable in einer Klasse zu haben, die Sie nicht stören wollen.

+1

Es gibt das Schlüsselwort @private für Instanzvariablen in einer Klassenimplementierung, die dies tut. – Abizern

8

Wie bereits erwähnt, wurde _someVar benutzt um zu sagen, dass eine Variable privat war. Es war eine einfache Frage der Konvention und spielt keine Rolle.

Eine andere Verwendung, eine Reise in der Wayback-Maschine in C a _function() stellte eine Funktion, die nicht Plattform tragbar war und __function() stellte eine Funktion, die nicht Compiler tragbar war. In der C-Standardbibliothek sehen Sie also manchmal eine Variable mit einem _ oder __ vor dem Namen, das sind diese Funktionen.

+0

Ich denke, das ist, wo _asm und __asm ​​herkommen? –

28

Was Sie sehen, ist die Verwendung von Unterstreichungen, um zwischen Instanzvariablen und Eigenschaften zu unterscheiden. So eine Klassendeklaration könnte sein:

@interface Foo { 
    NSString* _label; 
    .... 
} 

@property (nonatomic, retain) NSString* label; // notice: no underline 

Dann in der Implementierungsdatei würden Sie haben:

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

Wenn nun in der Umsetzung, wenn Sie die Instanzvariable zugreifen möchten direkt könnten Sie einfach _label verwenden Aber um durch die Eigenschaft Accessor-Methoden (die sich um Retain/Releases und eine Reihe anderer Buchhaltungsaufgaben kümmern) zu gehen, würden Sie self.label verwenden. Von außen möchten Sie immer durch die {object}.label Eigenschaft gehen.

Der andere Weg ist, ohne die unterstrichenen zu tun und benutzen Sie einfach:

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

Es funktioniert auf die gleiche, aber dann könnte es jemand liest den Code zu verwirren und zu versuchen, den Überblick über label vs self.label zu halten. Ich persönlich finde die Apple-Konvention (mit Unterstreichungen) ein bisschen einfacher zu lesen, aber es ist eine Frage der Präferenz.

+2

Danke. Persönlich mag ich dieses Unterstreichungs-Durcheinander nicht;) – Thanks

+0

Nicht ganz - Leute benutzen "_" in irgendeiner Anzahl von Programmiersprachen und taten dies in Objective-C, lange bevor Eigenschaften hinzugefügt wurden. Dies ist nur eine mögliche Verwendung, aber es gibt viele andere.Manche Leute bevorzugen "_" für alle Instanzvariablen oder nur für private Variablen oder was auch immer. Persönlich ist es auch nicht mein Stil. –

+2

Ich habe gerade viel Zeit damit verbracht, ein Speicherverwaltungsproblem aufzuspüren, weil eine Variable nicht gespeichert wurde, seit ich timer anstelle von self.timer benutzt habe. Nach dieser Erfahrung empfehle ich dringend die Verwendung eines _ vor allen privaten Variablen – Casebash

2

kann es sein, dass ... (Jogging-Speicher) ...

i vage ein ADC-Dokument erinnere mich gelesen zu erklären, dass Apple die Verwendung von Unterstrich-Präfix Membervariablen behält?und dass Entwickler von Drittanbietern davon abgehalten werden, diese Konvention zu verwenden, um Kollisionen zu vermeiden?

| K <

+0

Kollisionen? Beim Unterklassifizieren? Das könnte Sinn machen. – Thanks

+6

Falsch. Es sind Namen mit undefinierten Präfixen reserviert, keine Variablennamen. (Objective-C verwendet nicht den Begriff "Mitglied".) –

+0

@chris: Vielen Dank für die Klärung dieser für mich. – kent

2

I unterstreicht verwenden, um anzuzeigen, dass eine Variable Mitglied, ähnlich dem 'm' Präfix in der ungarischen Notation ist (die Schreibweise ich gründlich verachten, aber das ist eine andere Geschichte). Sicher, Sie bekommen heutzutage Farbcodierungs-Editoren, aber meiner Meinung nach macht das Präfix Sie darüber nach, dass die Variable ein Mitglied/Instanz vor ist, die Sie eingeben, nicht nur irgendwann danach, wenn es von Ihrem Editor farbcodiert wird.

1

ich Gebrauch wählen unterstreicht für ivars, weil ich auf die folgende Situation oft kommen:

@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 

So mache ich das:

@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 

Natürlich könnte ich alternativ die Parameter ändern Namen "newCount" oder "aCount" (ich hasse diesen). Ich denke, es ist Geschmackssache.

Verwandte Themen