现代(64 位 OS X 和 iPhone OS)Objective C 运行时的特性之一是属性能够动态合成 ivars 而无需在类中显式声明它们:
@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。由于各种原因,我想更新我的一些个人框架以在现代运行时使用合成 ivars,需要修改上述代码以使用合成 ivars 以实现该目标。
虽然 Objective C 2.0 文档声明现代运行时上的合成访问器将在首次使用时合成 ivar。它没有指定使用什么低级机制来执行此操作。是否由 class_getInstanceVariable() 完成,对 class_addIvar() 的限制是否松动,是否是目标 C 2.0 运行时中的未记录函数?虽然我可以为支持我的属性的数据实现自己的侧存储,但我更愿意使用合成访问器正在使用的机制。