Wann sollte ich @synthesize
meinen Code explizit ergänzen ?
Im Allgemeinen, wenn es erforderlich ist: Sie werden wahrscheinlich nie einen Fall treffen, in dem es erforderlich ist.
Es gibt jedoch einen Fall, den Sie vielleicht nützlich finden.
Angenommen, Sie schreiben sowohl einen benutzerdefinierten Getter als auch einen Setter, möchten jedoch, dass eine Instanzvariable diesen unterstützt. (Für eine atomare Eigenschaft ist dies so einfach wie der Wunsch nach einem benutzerdefinierten Setter: Der Compiler schreibt einen Getter, wenn Sie einen Setter für eine einatomige Eigenschaft angeben, jedoch keine atomare Eigenschaft.)
Bedenken Sie:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Dies wird nicht funktionieren, da _title
es nicht existiert. Sie haben sowohl einen Getter als auch einen Setter angegeben, sodass Xcode (korrekt) keine Hintergrundinstanzvariable dafür erstellt.
Sie haben zwei Möglichkeiten, um es zu schaffen. Sie können entweder Folgendes ändern @implementation
:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Oder ändern Sie es in Folgendes:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Mit anderen Worten, obwohl Synthetisieren für praktische Zwecke niemals erforderlich ist *, kann es verwendet werden, um Instanzvariablen zur Sicherung von Eigenschaften zu definieren , wenn Sie einen Getter / Setter bereitstellen. Hier können Sie entscheiden, welches Formular Sie verwenden möchten.
In der Vergangenheit habe ich es vorgezogen, die Instanzvariable in der anzugeben @implementation {}
, aber jetzt denke ich, dass die @synthesize
Route eine bessere Wahl ist, da sie den redundanten Typ entfernt und die Hintergrundvariable explizit an die Eigenschaft bindet:
- Ändern Sie den Typ der Eigenschaft, und der Typ der Instanzvariablen ändert sich.
- Ändern Sie das Speicherqualifikationsmerkmal (z. B. machen Sie es schwach statt stark oder stark statt schwach), und das Speicherqualifikationsmerkmal ändert sich.
- Wenn Sie die Eigenschaft entfernen oder umbenennen,
@synthesize
wird ein Compilerfehler generiert. Sie werden nicht mit streunenden Instanzvariablen enden.
* -Ich kenne einen Fall, in dem es notwendig war, die Funktionalität auf Kategorien in mehrere Dateien aufzuteilen. Und ich wäre nicht überrascht, wenn Apple dies behebt oder sogar schon behebt.