在objective-c中自动延迟创建自动属性

时间:2012-08-21 02:14:30

标签: objective-c properties

我有一个属性

@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语言中?

2 个答案:

答案 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