Das ist wirklich sehr hilfreich, aber die meisten Leute wissen nicht, warum, und das ist schade. Apple verwendet Unterstriche, um die Art und Weise, wie andere Objekte auf die Variablen eines bestimmten Objekts zugreifen, von der Art und Weise zu trennen, wie ein bestimmtes Objekt auf seine eigenen Variablen zugreift. Das mag jetzt etwas seltsam klingen, aber stellen Sie sich Folgendes vor: Sie kennen wahrscheinlich alle die folgende Compilerwarnung
.h
@property (nonatomic, retain, readonly) UITableView *tableView;
.m
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return [self loadSomethingElseForTableView:tableView];
}
Dies führt zu einer Compiler-Warnung, da er nicht weiß, ob Sie auf die lokale Variable "tableView" oder die Instanzvariable verweisen. Apple empfiehlt Ihnen daher, am Anfang Ihrer @Implementierung Folgendes hinzuzufügen.
@synthesize tableView = _tableView;
Wenn Sie sich nun auf _tableView
weiß der Compiler, dass Sie die Instanzvariable und nicht die lokale Variable meinen.
Dies macht es auch viel einfacher, die Garbage Collection in Obj-C zu verstehen und häufige Fehler zu vermeiden.
Zum Beispiel, wenn Sie das Folgende tun:
@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;
}
Da Sie den Standard-Setter nicht verwenden (eigentlich können Sie das nicht, da er schreibgeschützt ist), müssen Sie brauchen um die Variable selbst zu behalten. Dies ist viel einfacher zu merken, wenn Sie jeder Instanzvariablen ein Präfix geben (damit Sie wissen, dass Sie sie selbst behalten müssen).
Grundsätzlich ist es also wichtig, den Unterschied zwischen self.variable
und ( _
) variable
. (d.h.: self.variable
Karten zu [self setVariable:...]
y variable
wird direkt auf Ihren Zeiger abgebildet.
Wenn Sie sie außerdem als private Variable hinzufügen, wie hier:
@interface TSSomeObject : NSObject {
@private
NSString *_privateTitle;
}
@end
Der Unterstrich ist nicht wirklich notwendig, es sei denn, Sie stoßen auf lokale Variablen mit demselben Namen. Abgesehen davon ist es auch eine einfache Möglichkeit, Sie daran zu erinnern, dass es sich um einen lokalen Zeiger handelt und dass Sie die Variable behalten (und freigeben) müssen, wenn Sie sie Ihrem Objekt zuweisen.
Was ist falsch ist es, eine Eigenschaft mit einem Unterstrich-Präfix zu erstellen, etwa so:
@property (nonatomic, retain) NSString *_title;
Das ist wirklich falsch, und ich werde nicht einmal erklären, warum ;)
Also ja! Sie sollten wirklich Unterstrich-Präfixe verwenden, es macht Ihren Code viel einfacher zu lesen, und durch den Compiler zu interpretieren! In Xcode 4 hat Apple sogar diese @synthesize
s zu den Standardvorlagen.