我有一个属性
@property (strong, nonatomic, readonly) NSMutableArray* myArray;
我想懒惰地在getter中创建数组
- (NSMutableArray*)myArray
{
if(_myArray == nil)
{
_myArray = [NSMutableArray arrayWithCapacity:4];
}
return _myArray;
}
但这打破了iVar(`_myArray)的自动合成,否定了自动合成的一些好处,这意味着你必须以旧的方式做事。
这是一种非常常见的模式,并且自动合成getter的延迟创建版本会很不错。我想这会扩展到Objective-C语言和编译器,例如使用这样的附加属性属性:
@property (strong, nonatomic, readonly, lazycreate) NSMutableArray* myArray;
任何实现预定义类方法的类(以与object subscripting described here类似的方式),例如+ (ClassType*)defaultConstructor
都可以支持lazycreate
属性属性,然后自动合成可以合成getter在我的例子中这样:
- (NSMutableArray*)myArray
{
if(_myArray == nil)
{
_myArray = [NSMutableArray defaultConstructor];
}
return _myArray;
}
我是对的,这需要语言扩展,还是有一种聪明的方法来实现它?
这个想法是否存在任何问题或陷阱?它们是什么?
我如何将这个想法提出到Objective-C语言中?
答案 0 :(得分:1)
添加像lazycreate
这样的新属性需要修改编译器。您可以通过在http://bugreport.apple.com打开新问题来要求Apple添加它。该产品是“开发人员工具”,分类为“功能(新)”。
您可以像这样定义一个宏:
#define synthesizeLazy(Type, Property) \
synthesize Property = _##Property; \
- (Type *)property { \
if (_##Property == nil) { _##Property = [[Type alloc] init]; } \
return _##Property; \
}
然后用它来合成你的懒惰属性:
@synthesizeLazy(NSMutableArray, myArray);
使用全自动合成来伪造它是没有好办法的。
答案 1 :(得分:0)
您应该查看NSObject上可用的元编程方法,例如-implementationForMethod
。这允许您在运行时提供缺少方法的实现。
您可以使用它为任何声明的属性动态提供getter / setter。
然后您可以从默认值字典中读取..
您也可以尝试覆盖-valueForUndefinedKey:
这可能会有所帮助:https://gist.github.com/2370784