最新 (64 ビット OS X および iPhone OS) の Objective C ランタイムの機能の 1 つは、クラスで明示的に宣言せずに ivar を動的に合成するプロパティの機能です。
@interface MyClass : NSObject {
// NSString *name; unnecessary on modern runtimes
}
@property (retain) NSStrng *name;
@end
@implementation MyClass
@synthesize name;
@end
私のコードのかなりの部分で、プロパティを初期化するためにカスタム getter 実装を使用しています。
- (NSString *) name {
if (!name) {
name = @"Louis";
}
return name;
}
上記は、ヘッダーで宣言されていないivarにアクセスする必要があるため、合成されたivarと互換性がありません。さまざまな理由から、最新のランタイムでビルドするときに合成 ivar を使用するように多くの個人的なフレームワークを更新したいと考えています。その目標を達成するには、合成 ivar で動作するように上記のコードを変更する必要があります。
Objective C 2.0 のドキュメントには、最新のランタイムで合成されたアクセサーが最初の使用時に ivar を合成すると記載されています。これを行うために使用される低レベルのメカニズムは指定されていません。それは class_getInstanceVariable() によって行われますか、class_addIvar() の制限は緩和されますか、それは目的の C 2.0 ランタイムで文書化されていない関数ですか? プロパティをサポートするデータ用に独自のサイド ストレージを実装することもできますが、合成されたアクセサーが使用しているメカニズムを使用したいと思います。