Objective-C中的非原子和只读属性

时间:2013-01-10 17:44:33

标签: iphone objective-c macos cocoa properties

我已经好几次想要制作一个属性,同时nonatomicreadonly

这样做的好处是我可以覆盖getter并检查是否已经创建了一个实例。如果没有,我可以简单地创建它。

同时我可以保护它不被覆盖。


·H

@property (strong, readonly, nonatomic) Foo *bar;

的.m

- (Foo *)bar {
    if (!_bar) {
        _bar = [[Foo alloc] init];
    }

    return _bar;
}

每当我这样做时,编译器不会为我创建实例变量,因此_bar不存在。

为什么呢?如何创建readonly nonatomic属性?

3 个答案:

答案 0 :(得分:6)

您的财产声明是正确的。我相信这里的问题是,因为你的属性被声明为readonly,编译器不会自动合成底层实例变量。在这种情况下的解决方案是使用...

自己合成一个

@synthesize bar = _bar;

答案 1 :(得分:2)

你可以创建一个私有的setter:

@interface YourClass()  // In the .m file 

@property (strong, readwrite, nonatomic) Foo *bar;

@end

然后在分配变量时:

self.bar = [[Foo alloc] init];

编辑

Mark Adam的回答也是正确的。

答案 2 :(得分:1)

在实现中添加@synthesize bar = _bar。