2011-01-10 13 views
2

Ich definiere eine Variable in .h Interface-Methode der Datei wie folgt ...Was ist der Unterschied bei der Definition einer Variablen in der .h-Datei der interface() -Methode, ohne sie zu synthetisieren?

@interface ......{ 
    int a; 
} 

Dann habe ich es in .m-Datei verwenden, es funktioniert gut ....

i modifizierte auch den Code als

@interface ......{ 
    int a; 
} 
@property(nonatomic) int a; 

in .h-Datei, und in .m-Datei habe ich den int-Wert als

@synthesize a; 

Jetzt funktioniert es auch gut ...

Was ist der Unterschied zwischen beiden Fällen?

+0

Welche Sprache/Plattform ist das? – leppie

+0

Dies ist Ziel-C. Retagging. – cHao

+2

mögliches Duplikat von [Was ist der Unterschied bei der Definition einer Variablen in der .h-Datei (ohne sie zu synthetisieren)?) (Http://stackoverflow.com/questions/4643692/what-is-the-difference-in- defining-a-variable-in-h-files-interface-methode-alo) – Vladimir

Antwort

1

Durch die Erklärung Ihrer ‚a‘ Eigenschaft ermöglichen Sie es für den int gespeichert werden in Ihrer Klasse und Sie darauf zugreifen können aus Ihrer Klasse - aber : Diese Methoden können explizit oder implizit mit Punktsyntax aufgerufen werden nur innerhalb Ihrer Klasse. Wenn Sie möchten, dass es sich um eine Eigenschaft handelt, auf die andere Objekte zugreifen können (eine öffentliche Eigenschaft), benötigen Sie Getter- und Setter-Methoden.

Durch sie als @property in Ihrem .h erklärt und mit @synthesize in Ihrem .m, erstellen Sie automatisch zwei Methoden:

[myObject a]; // your getter 
[myObject setA:50]; // your setter 

Eine Sache im Auge zu behalten, hier ist, dass es oft eine sehr gute Idee die Verwendung von synthetischen Eigenschaften auch innerhalb Ihrer Klasse, da diese sich um Ihr Speichermanagement kümmern. Zum Beispiel, wenn Sie die @property als retain Flagge:

objectProperty = anObject; // just accessing locally, no memory management 
self.objectProperty = anObject; // [anObject retain] will be called 
self.objectProperty = nil; // [anObject release] will be called 
+1

... und vergiss nicht, 'myObject.a = 50' ist eine Abkürzung für' [myObject setA: 50] '. Der Compiler behandelt beide identisch. Das gleiche gilt für "myObject.a" und "[myObject a]". –

0

Wenn Sie eine Eigenschaft definieren und synthetisieren, können Sie auch auf den Wert zugreifen, indem Sie int value = self.a; self.a = newValue; verwenden. Dadurch wird die Variable auch für andere Objekte zugänglich. Ohne die Eigenschaft können Sie self. nicht verwenden, um zu der Variablen zu gelangen, und es gibt keinen automatischen Weg für andere Objekte, zu der Variablen zu gelangen.

0

Wenn Sie eine Eigenschaft definieren und synthetisieren, weisen Sie den Compiler an, sowohl ivar- als auch accessor-Methoden (- (int) a; und - (void) setA: (int) a_;) dafür zu generieren.

self.a = num; // [self setA:num] gets called 
2

Im ersten Fall verwenden Sie Feld, mit direktem Zugang zu ihnen. Im zweiten Fall definieren Sie die Objective-C-Eigenschaft mit Accessoren.