In Obj-c beim Deklarieren einer Variablen innerhalb @interface
@ Schnittstelle: NSObjekt { MyObject * myObject}
@property (unsichere, nicht atomare) MyObject * myObject;
Vs. Deklarieren Sie es nur als Eigenschaft
@interface: NSObject {}
@property (unsicher, nicht atomar) MyObject * myObject; @end
Keine Var hier deklarieren?
Grüße Christ
@property
definiert eine Schnittstelle, keine Implementierung. In Ihrem Fall definieren Sie eine Lese-Schreib-Eigenschaft. Dies bedeutet, dass Sie versprechen, -myObject
und -setMyObject:
zu implementieren. Das hat nichts mit Ivars zu tun.
Die gängigste Methode zur Implementierung dieser Methoden besteht nun darin, sie durch einen ivar unterstützen zu lassen. Zur Vereinfachung können Sie mit ObjC automatisch die benötigten Methoden mit einem IVAR-Speicher generieren, indem Sie @synthesize myObject=myObject_;
verwenden. Dies bedeutet "Erstellen Sie die erforderlichen Methoden für die Eigenschaft myObject
mit einem automatisch erstellten Ivar namens myObject_
". Der ivar myObject_
ist ein echter Ivar, und Sie können normal darauf zugreifen (obwohl Sie das normalerweise nicht sollten; Sie sollten Accessoren verwenden).
Anstatt @synthesize
zu verwenden, könnten Sie einfach -myObject
und -setMyObject:
implementieren. Sie könnten sogar @dynamic myObject;
verwenden, um dem Compiler mitzuteilen, dass Sie sich keine Gedanken über die Implementierungen für diese Eigenschaft machen müssen; sie werden zur Laufzeit korrekt behandelt.
Es gibt ein paar Unterschiede zwischen @property
und nur deklarieren Methoden, aber im Prinzip diese Zeile:
ist konzeptionell das Gleiche:
%Vor% Wenn Sie den ivar selbst deklarieren, hat das keine Auswirkungen. Sie müssen die Methoden dennoch implementieren. Wenn Ihr benannter ivar mit dem ivar @synthesize
identisch ist, dann wird @synthesize
einfach keinen neuen ivar erstellen.
In der Praxis rate ich Menschen davon ab, Ivars mehr zu deklarieren. Ich empfehle, nur öffentliche und private Eigenschaften mit @synthesize
zu verwenden, um alle benötigten Ivars zu erstellen. Wenn Sie aus irgendeinem Grund einen manuellen Ivar haben müssen, empfehle ich, sie im Block @implementation
und nicht im @interface
zu deklarieren.
Tags und Links objective-c iphone