我已经好几次想要制作一个属性,同时nonatomic
和readonly
。
这样做的好处是我可以覆盖getter并检查是否已经创建了一个实例。如果没有,我可以简单地创建它。
同时我可以保护它不被覆盖。
@property (strong, readonly, nonatomic) Foo *bar;
- (Foo *)bar {
if (!_bar) {
_bar = [[Foo alloc] init];
}
return _bar;
}
每当我这样做时,编译器不会为我创建实例变量,因此_bar
不存在。
为什么呢?如何创建readonly
nonatomic
属性?
答案 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。