Ich bin sehr neu in Objective C. (Zwei Tage). Als es über @synthesize
gelesen wurde, schien es sich mit meinem Verständnis von @property
zu überlappen (was ich zu verstehen glaubte) ... Also, einige Details müssen in meinem Kopf ausgebügelt werden ... es nervt mich.
Bitte korrigiere mich, wenn ich mich bei Differenzen von @property
und @synthesize
irreführe:
Wenn Sie in Ihrem @property
eine @interface
deklarieren, dann sagen Sie der Welt, dass Benutzer erwarten können, Standard-Getter und Setter für diese Eigenschaft zu verwenden. Darüber hinaus macht XCode generische Getter und Setter für Sie. ... ABER In welchem Maße geschieht das mit der @property-Deklaration? (I. E. bedeutet das "vollständig" ... wie ungesehene Deklarationen dafür in Ihrem @interface
und auch unsichtbaren Code in Ihrem @interface
?
-Or -
Passt @property
nur in Ihrem @interface
auf die ungesehenen Code-Deklarationen - während @synthesize
in Ihrem @implementation
-Abschnitt auf die unsichtbare Code-Implementierung achtet? )
Beachten Sie, dass die neueste Version von Xcode überhaupt keine @ synthesize mehr benötigt. Sie können (und sollten) es einfach weglassen. Das heißt, hier ist was die Stücke tun.
@property
ist eine Deklaration von Accessoren. Es ist nur eine Erklärung. Es gibt sehr wenig Unterschied zwischen den folgenden:
gegen
%Vor% Der Hauptunterschied besteht darin, dass durch das Deklarieren dieser Methoden mit @property
der Compiler automatisch die Implementierungen für Sie generieren (synthetisieren) kann. Es ist nicht erforderlich, dass der Compiler das für Sie erledigt. Sie können absolut something
und setSomething:
von Hand implementieren, und es ist üblich zu tun. Wenn Sie sie jedoch nicht manuell implementieren, erstellt der Compiler automatisch einen Ivar namens _something
und erstellt eine sinnvolle Implementierung für den Getter und Setter.
In älteren Versionen von Xcode mussten Sie explizit die automatische Generierung mit dem Schlüsselwort @synthesize
anfordern. Aber das ist nicht mehr erforderlich. Heute ist der einzige Grund, @synthesize
zu verwenden, wenn Sie möchten, dass der ivar einen nicht standardmäßigen Namen hat (niemals das tun).
Ein wichtiger Punkt hier ist, dass die Methoden something
und setSomething:
nur Methoden sind. Es gibt nichts Magisches an ihnen. Sie sind keine speziellen "Eigenschaftsmethoden". Sie sind nur Methoden, die per Konvention auf ein Stück Staat zugreifen. Dieser Zustand wird oft in einem Ivar gespeichert, muss aber nicht sein.
Um noch deutlicher zu werden: object.something
bedeutet nicht bedeutet "gebe den ivar mit dem Namen _something
from object
" zurück. Es bedeutet "gib das Ergebnis von [object something]
zurück, egal was das tut." Es ist üblich, dass der Wert eines Ivar zurückgegeben wird.
Sie sollten Ihren gesamten Status (intern und extern) mit den @property
-Deklarationen deklarieren, und Sie sollten vermeiden, direkt Ivars zu deklarieren. Sie sollten Ihre Eigenschaften auch immer über ihre Accessoren ( self.something
) aufrufen, außer in den Methoden init
und dealloc
. In init
und dealloc
sollten Sie direkt den ivar ( _something
) verwenden.
@property
deklariert eine Eigenschaft Ihrer Klasse mit der von Ihnen bereitgestellten Semantik für Atomizität und Setter.
Mit Xcode 4.4 steht Autosynthese zur Verfügung, bei der Sie von Ihrer Property ein Backing-ivar erhalten, ohne es in @synthesize
zu deklarieren. Dieser Ivar hat die Form _propertyName
, wobei der Name Ihrer Eigenschaft propertyName
ist.
Tags und Links objective-c properties synthesis