2012-10-04 14 views
8

Ich bin sehr neu in Objective C. (Zwei Tage jetzt). Als es über @synthesize gelesen wurde, schien es zu überlappen mit meinem Verständnis (von dem ich dachte, dass ich es verstanden habe) ... Also, einige Details müssen in meinem Kopf ausgebügelt werden ... es nervt mich.@property und @synthesize

mich bitte korrigieren, wenn ich über die Unterschiede von @property falsch bin und @synthesize:

Wenn Sie eine @property in Ihrem @interface erklären, dann bist du die Welt zu sagen, dass die Nutzer Standard-Getter und Setter verwenden erwarten können diese Eigenschaft. Weiter, XCode wird allgemeine Getter und Setter für Sie machen. ... Aber, bis zu welchem ​​Grad passiert , dass mit der @property-Deklaration passieren? (IE bedeutet, dass "vollständig" ... wie ungesehen Erklärungen für sie in Ihren @interface und auch unsichtbaren Code in Ihrem @interface?

-Oder--

Does @property der unsichtbaren Code Erklärungen kümmern sie in Ihrem @interface nur - während @synthesize kümmert sich um den unsichtbaren Code-Implementierung in Ihrem @implementation Abschnitt)

+3

Denken Sie daran, wenn Sie eine '@ Eigenschaft' mehr als wahrscheinlich haben, benötigen Sie die '@ synthetisieren '. Dies ist weil yes '@ property' der Welt mitteilt, dass ein generischer' Getter' und 'Setter' benötigt werden, aber' @ synthesize' tatsächlich die 'getters' und' setter' erzeugt, können Sie diese überschreiben und Ihre eigenen erstellen 'Getters' und' Setter' wenn du so magst wie die erzeugten werden sehr einfach sein. Schauen Sie sich die iTunesU 'iPad und iPhone Anwendungsentwicklung von Paul Hegarty' an. So denke ich darüber und es ist noch nicht gescheitert. – Popeye

+0

Vielen Dank Popeye ... ITunes U ist FANTASTISCH !!! Ich bin tatsächlich auf Lektion 4 oder Pauls 2011-Serie. Ich bin gerade dabei, das XCode 4 Learning Objective C neben diesen Serien zu lesen ... das war mir immer noch nicht klar. – RichWalt

Antwort

7

@property deklariert eine Eigenschaft auf Ihrer Klasse mit dem, was die Unteilbarkeit und Setter-Semantik Sie.

Mit Xcode 4.4 ist Autosynthese verfügbar, 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 Unterkunft propertyName ist.

+0

Dies hat den Nagel auf den Kopf getroffen, kurz süß und einfach. +1 – Popeye

+0

Ja ... Ich wusste, dass Sie "Ihre Eigenschaft var" mit einem anderen ivar (das sollte von Ihrer Klasse verwendet werden, und vor allem mit den Gettern und Setter.) ... Vielen Dank für Ihre Antwort. .. Ich bin überwältigt von der Geschwindigkeit der hilfreichen Antworten ... (Dies ist mein erster Post hier, nachdem ich erst vor ein paar Minuten beigetreten bin)! - Danke, dass du dir Zeit genommen hast, um diesen Beitrag Alan zu schreiben! – RichWalt

16

Beachten Sie zuerst, dass die neueste Version von Xcode überhaupt kein @ synthesize mehr benötigt. Sie können (und sollten) es einfach weglassen. Das heißt, hier ist, was die Stücke tun.

ist eine Erklärung der Accessoren. Es ist nur eine Erklärung. Es gibt sehr wenig Unterschied zwischen den folgenden:

@property (nonatomic, readwrite, strong) NSString *something; 

gegen

- (NSString *)something; 
- (void)setSomething:(NSString)aSomething; 

Der wesentliche Unterschied besteht darin, dass diese Methoden erklärt @property mit der Compiler (synthetisieren) automatisch generieren können die Implementierungen für Sie. Es ist nicht erforderlich, dass der Compiler das für Sie erledigt. Sie sind absolut frei, something und setSomething: von Hand zu 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 wollen, dass der IVAR einen nicht standardmäßigen Namen hat (niemals das tun).

Ein wichtiger Punkt hier ist, dass die Methoden something und setSomething: sind nur Methoden. Es gibt nichts Magisches an ihnen. Sie sind keine speziellen "Eigentumsmethoden.„Sie sind nur Methoden, die vereinbarungsgemäß Zugang ein Stück Zustand Dieses Stück Zustand oft in einem Ivar gespeichert ist, muss aber nicht sein

Um noch deutlicher:.. object.something tut nicht mean“ Rückkehr der ivar _something von object genannt.“Es bedeutet‚das Ergebnis der [object something] zurückkehren, was auch immer das tut.‘Es ist üblich, dass die den Wert eines ivar zurückzukehren.

Sie sollten alle Ihre (interner erklären und external) unter Verwendung von Deklarationen, und Sie sollten vermeiden, direkt Ivars zu deklarieren.Sie sollten auch immer Zugriff auf Ihre Eigenschaften über ihre Accessoren (self.something), außer in die init und dealloc Methoden. In init und dealloc sollten Sie direkt den ivar (_something) verwenden.

+0

Rob, Vielen Dank für Ihre Zeit und Antwort. Das Betrachten von iOS-Videos auf iTunes U vom letzten Jahr (2011) ... und der Versuch, mit den Änderungen in XCode Schritt zu halten, sorgt manchmal für Verwirrung. Genau auf den Lehrer hören und sogar einen Test mit einfachem Code machen ... hey, sogar das Lesen der XCode-Dokumentation hat nicht ganz klar gemacht, dass @synthesis nicht notwendig war! Eine hilfreiche Bestätigung wie die Ihre trägt zur Zuversicht bei, dass ich nichts falsches gelernt habe ... während ich weitermache. :-) Jetzt ... wenn jemand einen externen Link hat, wo ich anfangen kann, richtig über MVC nachzudenken - das wäre großartig !! – RichWalt

+0

Starten Sie hier: http://developer.apple.com/library/ios/#documentation/General/Conceptual/CocoaEncyclopedia/Model-View-Controller/Model-View-Controller.html%23//apple_ref/doc/uid/ TP40010810-CH14. Dann hier: http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007457 –

+0

Betrachte das jetzt! Tausend Dank!!!! – RichWalt