0

我有财产

@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;

任何实现预定义类方法的类(以类似于此处描述的对象下标的方式),例如+ (ClassType*)defaultConstructor可以支持lazycreate属性属性和自动合成,然后可以在我的示例中合成 getter,如下所示:

- (NSMutableArray*)myArray
{
    if(_myArray == nil)
    {
        _myArray = [NSMutableArray defaultConstructor];
    }
    return _myArray;
}

我对这需要语言扩展是对的,还是现在有一个聪明的方法来实现它?

这个想法有什么问题或陷阱吗?它们是什么?

我如何在 Objective-C 语言中提出这个想法?

4

2 回答 2

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);

完全自动合成没有很好的方法来伪造它。

于 2012-08-21T03:08:23.343 回答
0

您应该查看 NSObject 上可用的元编程方法,例如-implementationForMethod. 这允许您在运行时提供缺失方法的实现。

您可以使用它为任何声明的属性动态地提供 getter/setter。

然后,您可以从默认值字典中读取..

您也可以尝试覆盖-valueForUndefinedKey:

这可能会有所帮助:https ://gist.github.com/2370784

于 2012-08-21T03:15:08.280 回答