2011-01-16 24 views
1

deklarieren Ich bin Neuling in Objective. Wie ich viele Tutorials gelesen habe, hat @property eine Variable für einen Typ, die gleiche Variable ist auch in @inferface deklariert. Ist das nötig?Warum sollten wir Variablen für @property

Beispiel

@interface MyInterface : NSObject 
{ 
    NSInteger myVaribale; 
} 
@property(retain) NSInteger myVariable; 

Hier myVariable wird sowohl Ort erklärt.

Antwort

6

seit iOS 4 können Sie

@interface MyInterface : NSObject { 
} 

@property(assign) NSInteger myVariable; 

@implementation MyInterface 
@synthesize myVariable; 
@end 

schreiben Bedeutung Sie die NSInteger myVaribale in Ihrer Interface-Deklaration weglassen kann, solange man es in der .m synthetisieren (die synthesize wird Setter, Getter und Instanz-Variable erstellen)

Ein Nachteil ist, dass Sie den Wert von myVariable in Xcode Debugger nicht sehen.

+0

Ich wusste nicht darüber. Das ist ziemlich nett. Es ist eine Schande, dass es nicht auf dem Debugger angezeigt wird. –

0

Es ist keine Unannehmlichkeit, aber mehr ein grundlegendes Konzept von objc: Eine Klasse kann Mitglied Variablen haben. In OOP definieren Sie normalerweise Getter und Setter für Membervariablen, die nach außen verfügbar sein sollten. In objective-c werden Sie aufgefordert, Getter/Setter jederzeit zu definieren (wenn sie privat sein sollen, legen Sie ihre Deklarationen in eine private Schnittstelle). Zur Vereinfachung dieser Aufgabe verwendet objective-c Eigenschaften, die nicht mehr als eine Abkürzung sind. Zusätzlich gibt es Dinge wie Schlüssel-Wert-Codierung und -beobachtung, die durch Eigenschaften aktiviert werden, aber im Grunde sind sie nur Abkürzungen für Getter und Setter.

Fazit: Innerhalb von @interface deklarieren Sie Member, externe Methoden einschließlich Getter/Setter (Eigenschaften).

+0

Dies gilt nur für die 32-Bit-Desktop-Laufzeit. Die anderen erlauben @properties, auch Speicher zu synthetisieren. – bbum

5

Als Hinweis, die Neudeklaration vom Typ der Ivar in der @property Anweisung kann auch nützlich sein, wenn Sie die Eigenschaft als unveränderlich Typ des Ivars, zum Beispiel erklären wollen:

@interface MyClass : NSObject 
{ 
    NSMutableArray *myArray; 
} 

@property (retain) NSArray *myArray; 

In In diesem Fall wird der ivar tatsächlich als NSMutableArray gespeichert und kann daher während des Lebenszyklus des Objekts geändert werden.

Dies ist jedoch ein internes Detail, und wenn Sie nicht "werben" wollen, ist es veränderbar (veränderbar), können Sie den Typ der Eigenschaft als unveränderlichen Typ festlegen - in diesem Fall eine NSArray.

Obwohl dies nicht wirklich stoppen anderen Code mit dem zurückgegebenen Array als veränderbar, es ist gute Konvention und benachrichtigt anderen Code, dass es sollte nicht behandelt es auf diese Weise.

Verwandte Themen