2011-08-09 30 views
9

誰かが、私はクラスの唯一のインスタンスは、それらを参照できるように、プライベートプロパティを作ることができる(自己経由。)プロパティを非公開にするにはどうすればよいですか?

しかし、私はクラスインターフェイスで@privateを使用して、通常のプロパティを宣言した場合、それを私に言いましたクラスの外からでもアクセスできます...どうすればプロパティを非公開にできますか?構文例をご覧ください。

答えて

20

これらのプロパティをクラス拡張に含める必要があります。これにより、インターフェース宣言の中の実装ファイル内のプロパティー(そして最近はiVars)を定義することができます。カテゴリの定義に似ていますが、かっこの間に名前はありません。

だからこれはあなたの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

クラス拡張は、アクセスが必要なクラスでのみインポートするようにヘッダーファイルに入れることができます。したがって、「ライブラリプライベート」プロパティを効果的に許可します。 – bbum

5

は、実装(.M)ファイル内のプロパティを宣言しますので、のような:

@interface MyClass() 

@property (nonatomic, retain) MyPrivateClass *secretProperty; 

@end 

はあなたが使用することができますコンパイラの警告なしでクラス内のそのプロパティ。

+0

そこに財産を作ることの利点は何ですか?私たちは直接ivarを使うことができます。 – Imran

+1

利点は、一貫性(パブリックプロパティとプライベートプロパティは同じ方法でアクセスされます)、明快さ(プロパティはプロパティのように見える)、柔軟性(すべてのプロパティアクセスは同じメソッドを経由するため、遅延ロードや計算プロパティなどはすべて些かです) 。 – kubi

関連する問題