Hier gibt es viel zu beantworten. Ich werde es zerlegen:
Ivars deklarieren
Wie Sie korrekt bemerkt haben, werden moderne Versionen des Compilers Backing -Instanzvariablen für deklarierte @Properties synthetisieren. Die Ausnahme davon liegt bei 32-Bit-Macs, bei denen die moderne Ziel-C-Laufzeit, einschließlich nicht-fragiler Instanzvariablen, nicht verfügbar ist. Unter der Annahme, dass Ihre Bewerbung nicht auf 32-Bit-OS X abzielt @property
.
Wenn Sie immer noch einen IVAR direkt verwenden möchten, ohne einen entsprechenden @property
(Etwas, das ich die meiste Zeit für eine schlechte Idee halte), Sie müssen natürlich den IVAR ausdrücklich erklären.
@dynamic
@dynamic
ist, wie Sie gesagt haben, dem Compiler zu sagen, dass "Accessors für diese Immobilie nicht synthetisieren, ich werde es selbst zur Laufzeit tun". Es wird nicht so oft verwendet. Ein Ort, an dem es verwendet wird, ist an NSManagedObject
Unterklassen, wenn Sie, wenn Sie eine modellierte Eigenschaft im Header deklarieren, nicht zusammenstellen möchten, dass es sich beschweren, dass es keine Implementierung von Zubehör für diese Eigenschaft gibt, und Sie möchten auch nicht, dass sie Zubehör selbst generieren. NSManagedObject
Generiert Accessors für modellierte Eigenschaften zur Laufzeit. Die Geschichte ist für benutzerdefinierte Calayer -Unterklassen ähnlich.
@synthesize
@synthesize
fordert den Compiler explizit an, Accessor-Methoden und (auf iOS und 64-Bit-Mac) einen entsprechenden IVAR für die angegebene Eigenschaft zu synthetisieren. Es gibt drei Hauptfälle, in denen Sie es noch verwenden müssen:
- 32-Bit-Mac-Apps.
- Wenn Sie Ihren eigenen benutzerdefinierten Setter und Getter geschrieben haben (oder nur Getter für Readonly -Eigenschaften). In diesem Fall synthetisiert der Compiler Accessors nicht, da er Ihre sieht. Es wird jedoch auch den Backing IVAR nicht synthetisieren. Sie müssen also verwenden
@synthesize someProperty = _someProperty;
, um dem Compiler zu sagen, er solle einen Ivar synthetisieren. Es wird natürlich immer noch keine Accessor -Methoden synthetisieren. Alternativ können Sie explizit einen Backing -IVAR deklarieren. Ich bevorzuge@synthesize
in diesem Fall. - Wenn Sie einen anderen Namen für den Backing IVAR der Eigenschaft als den Standard verwenden möchten (Eigenschaftsname mit einem zusätzlichen Unterstrich). Das ist selten. Der Hauptfall, an den ich mich für die Verwendung vorstellen kann, ist der Übergang vorhandener älterer Code, der den direkten IVAR-Zugriff umfasst und wenn die IVARs nicht unterstreichen.