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.
Oder statisch in C. –