2012-07-03 13 views
11

Ich habe die folgende Klasse-Schnittstelle:ObjectiveC: Wo private Instanzeigenschaften deklarieren?

@interface MyClass : NSObject 

@property int publicProperty; 

@end 

dann die Umsetzung:

@interface MyClass() // class extension 

- (void)privateMethod; // private methods 

@end 

@implementation MyClass { 
    int _privateProperty; 
} 

@property int privateProperty = _privateProperty; 

@end 

das ist, was der Apple-Kerl in der WWDC zeigte, aber gibt es einen Grund für die nicht wie _privateProperty in Klassenerweiterung setzen :

@interface MyClass() // class extension 
{ 
    int _privateProperty; 
} 

- (void)privateMethod; // private methods 

@end 

Danke!

+0

Sie viele gute Antworten finden könnte zu Ihrer Frage hier: http://stackoverflow.com/search?q=private+property – Monolo

+0

mögliche dup licate von [Wie man eine private Eigenschaft macht?] (http://stackoverflow.com/questions/2768750/how-to-make-a-private-property) – Monolo

Antwort

5

Sie müssen nicht beide Ihre ivars in der Schnittstelle erklären und die implementation.Because Sie sie privat machen möchten, können Sie sie einfach wie so in der Implementierungsdatei erklärt:

@implementation { 

int firstVariable; 
int secondVariable; 
... 
} 
//properties and code for your methods 

Wenn Sie möchten, können Sie Getter- und Setter-Methoden erstellen, damit Sie auf diese Variablen zugreifen können.

Die Person, mit der Sie gesprochen haben, war richtig, dachte, es gibt keinen Grund, warum Sie sie nicht auf die gleiche Weise in der Schnittstelle erklären würden. Einige Bücher lehren dich tatsächlich, dass das @ Interface das öffentliche Gesicht der Klasse zeigt und was du in der Implementierung hast, ist privat.

0

Wollen Sie private Instanzvariablen deklarieren?

Sie können dies tun:

@interface MyClass() 
{ 
@private //makes the following ivar private 
    int _privateProperty; 
} 
+0

Ja, aber ich will es nicht ivar machen, es ist nur eine Eigenschaft, auf die von self.privateProperty mit Accessor zugegriffen werden kann und die nicht in @interface verfügbar ist. – hzxu

+0

Sie können es nicht durch diese '@property int privateProperty = _privateProperty;' tun, Sie müssen es in der Implementierungsdatei tun. –

0

Mit der "modernen Laufzeitumgebung" (64-Bit MacOS post-10.5 und alle Versionen von iOS) müssen Sie keine Instanzvariablen deklarieren.

// MyClass.h 
@interface MyClass : NSObject 

@property int publicProperty; 

@end 


// MyClass.m 
@implementation MyClass 

@synthesize publicProperty = _privateProperty; // int _privateProperty is automatically synthesized for you. 

@end 
9

ich in der Regel private "zwingen" mit einer Erweiterung in der Umsetzung

In Ihrem Header

@interface MyClass : NSObject 
{ 
} 

@property (nonatomic, assign) int publicProperty; 

@end 

in Ihrer Implementierung-Datei:

@interface MyClass() 
@property (nonatomic, assign) int privateProperty; 
@end 


@implementation MyClass 
@synthesize privateProperty; 
@synthesize publicProperty; 

@end