@property und @synthesize

8

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? )

    
RichWalt 04.10.2012, 15:04
quelle

2 Antworten

16

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:

%Vor%

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.

    
Rob Napier 04.10.2012 15:19
quelle
7

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

    
FluffulousChimp 04.10.2012 15:12
quelle