objective-c interface - deklariert Variable vs nur Eigenschaft?

7

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

    
Chris G. 30.01.2012, 14:31
quelle

2 Antworten

10

@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:

%Vor%

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.

    
Rob Napier 30.01.2012, 14:59
quelle
9

Das Überspringen der Deklaration des ivars ist völlig in Ordnung - aber Sie werden den Wert des ivars in der Xcode IDE nicht sehen können. Eines Tages könnte Apple das reparieren.

Sie können den ivar "po", um ihn in GDB oder lldb zu überprüfen.

    
zaph 30.01.2012 14:47
quelle

Tags und Links