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

NSA*_*ict 3 iphone macos cocoa properties objective-c

有几次已经我想作一个属性,它是nonatomicreadonly在同一时间.

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

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


.H

@property (strong, readonly, nonatomic) Foo *bar;
Run Code Online (Sandbox Code Playgroud)

.M

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

    return _bar;
}
Run Code Online (Sandbox Code Playgroud)

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

为什么?我该如何创建一个readonly nonatomic属性?

Mar*_*ams 6

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

@synthesize bar = _bar;

  • 只有当你没有提供getter(以及readwrite属性,也就是setter)时,Xcode会自动合成属性*. - 这是正确的答案. (2认同)
  • 我相信当您将属性声明为只读时,它不会自动执行此操作. (2认同)