さまざまなレベルのプライベート性を持つことができるのは、カプセル化の問題です...
もともと Objective-C では、ランタイムは実行時に実際のフィールドをオブジェクトに追加することをサポートしていなかったため、すべての iVar をクラスにリストする必要がありました。
@interface MyClass : NSObject
{
//every ivar that MyClass adds to NSObject must be here
}
これは、しばらくの間、シンプルで十分に優れたシステムでした...
プライベートな iVar でさえ宣言する必要がありましたが、コンパイラは間違ったスコープでそれらにアクセスすることを許可しませんでした。
@interface MyClass : NSObject
{
@private
id someObj;
}
この可視性指定子は、次のようなアクセスを制限しました:
//someotherclass.m
+ (void)doSomething
{
MyCLass * mc = [MyClass new];
mc->someObj = [SomeOtherClass new]; // error cant access private variable...
}
しかし、ポインタ算術でそれに到達する可能性があるため、難読化するために、クラスで次のようなものが表示されます。
@interface MyClass : NSObject
{
@private
void * __reserved1;
void * __private1;
}
それはかなり良い難読化です...
しかし、待ってください....もっと良い方法があるはずです!
壊れにくいABIに入る
現在、クラスはスーパークラスとパブリック インターフェイスをエクスポートするだけで済みます。
@interface MyClass : NSObject
@property (readonly,retain) id someIVar;
クラスの内容の残りの部分は、クラス拡張に含めることができます。
@interface MyClass ()
{
id someObj;
}
@property (readwrite,retain) id someIVar;
これはiPhoneと64ビットOS Xでのみ機能することに注意してください.32ビットOS Xはまだ古いABIであり、そこで機能する必要があるライブラリは古い方法である必要があります.