3

有几次我已经想建造一处房产,nonatomic同时readonly也是。

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

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


。H

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

.m

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

    return _bar;
}

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

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

4

3 回答 3

6

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

@synthesize bar = _bar;

于 2013-01-10T17:52:22.003 回答
2

您可以创建一个私人二传手:

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

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

@end

然后在分配变量时:

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

编辑

马克亚当的回答也是正确的。

于 2013-01-10T17:51:22.227 回答
1

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

于 2013-01-10T17:57:16.037 回答