2012-07-03 19 views
11

Mam następujące klasy interfejs:ObjectiveC: gdzie zadeklarować prywatne właściwości instancji?

@interface MyClass : NSObject 

@property int publicProperty; 

@end 

następnie realizacja:

@interface MyClass() // class extension 

- (void)privateMethod; // private methods 

@end 

@implementation MyClass { 
    int _privateProperty; 
} 

@property int privateProperty = _privateProperty; 

@end 

to właśnie facet firmy Apple pokazał w WWDC, ale jest jakiś powód, dla którego nie oddanie _privateProperty w rozszerzeniu klasy jak :

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

- (void)privateMethod; // private methods 

@end 

Dzięki!

+0

Można znaleźć wiele dobrych odpowiedzi na twoje pytanie tutaj: http://stackoverflow.com/search?q=private+property – Monolo

+0

możliwe dup lemat z [jak zrobić prywatną własność?] (http://stackoverflow.com/questions/2768750/how-to-make-a-private-property) – Monolo

Odpowiedz

5

Nie musisz zadeklarować Ivars zarówno w interfejsie i implementation.Because chcesz uczynić je prywatny może po prostu ogłosił je w pliku wdrażania tak:

@implementation { 

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

Jeśli chcesz, możesz utworzyć metody getter i setter, aby uzyskać dostęp do tych zmiennych.

Osoba, z którą rozmawiałeś, miała rację, uważała, że ​​nie ma żadnego powodu, dla którego NIE byś zadeklarował ich w interfejsie w ten sam sposób. Niektóre książki faktycznie uczą, że @interface pokazuje publiczną twarz klasy, a to, co masz w implementacji, będzie prywatne.

0

Czy chcesz zadeklarować prywatne zmienne instancji?

Można to zrobić:

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

Tak, ale nie chcę, żeby to było Ivar, to jest po prostu właściwością, do której można uzyskać dostęp przez self.privateProperty za pomocą narzędzia accessor i nieujawnioną w interfejsie @. – hzxu

+0

Nie można tego zrobić przez to '@property int privateProperty = _privateProperty;', musisz to zrobić w pliku implementacji. –

0

W przypadku "nowoczesnego środowiska wykonawczego" (64-bitowy system MacOS po wersji 10.5 i wszystkie wersje systemu iOS) nie trzeba w ogóle deklarować zmiennych instancji.

// 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

zwykle "zmusić" prywatne z rozszerzeniem w realizacji

W nagłówku

@interface MyClass : NSObject 
{ 
} 

@property (nonatomic, assign) int publicProperty; 

@end 

W pliku realizacji:

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


@implementation MyClass 
@synthesize privateProperty; 
@synthesize publicProperty; 

@end