2011-08-09 15 views
9

Ktoś powiedział mi, że mogę uczynić własności prywatnej, tak że tylko instancją klasy może odnosić się do nich (przez siebie).Jak zrobić własności prywatne?

Jednakże, jeśli mogę użyć @private w interfejsie klasy, a następnie zadeklarować właściwość normalnie, to nadal można uzyskać dostęp spoza klasy ... Jak mogę uczynić właściwości prywatnymi? Proszę podać przykład składni.

Odpowiedz

20

Te właściwości należy uwzględnić w rozszerzeniu klasy. Pozwala to na zdefiniowanie właściwości (a ostatnio iVars) w pliku implementacji w deklaracji interfejsu. Jest podobny do definiowania kategorii, ale bez nazwy między nawiasami.

Więc jeśli jest to plik MyClass.m:

// Class Extension Definition in the implementation file 
@interface MyClass() 

@property (nonatomic, retain) NSString *myString; 

@end 

@implementation MyClass 

- (id)init 
{ 
    self = [super init]; 
    if(self) 
    { 
     // This property can only be accessed within the class 
     self.myString = @"Hello!"; 
    } 
} 

@end 
+4

Należy zauważyć, że rozszerzenie klasy może znajdować się w pliku nagłówkowym, który można #portować tylko w klasach wymagających dostępu, tym samym skutecznie zezwalając na właściwość "biblioteki prywatnej". – bbum

5

stwierdzenie właściwość w pliku realizacja (.m), tak jak poniżej:

@interface MyClass() 

@property (nonatomic, retain) MyPrivateClass *secretProperty; 

@end 

Będziesz mógł korzystać tę właściwość w twojej klasie bez ostrzeżenia kompilatora.

+0

Jaka jest zaleta tworzenia nieruchomości tam. Możemy bezpośrednio używać ivar. Czy jest jakiś? – Imran

+1

Zaletami są spójność (dostęp do właściwości publicznych i prywatnych odbywa się w ten sam sposób), przejrzystość (właściwości wyglądają jak właściwości) i elastyczność (dostęp do wszystkich nieruchomości przebiega tą samą metodą, więc leniwy ładunek, obliczone właściwości itp. Są trywialne) . – kubi