Enc*_*ada 6 cocoa objective-c automatic-ref-counting
在我的界面(.h)文件中,我有
@property(readonly) NSString *foo;
Run Code Online (Sandbox Code Playgroud)
在我的实现(.m)文件中,我有
@synthesize foo;
Run Code Online (Sandbox Code Playgroud)
启用ARC后,编译器会给出以下错误:自动引用计数问题:ARC禁止使用未指定的所有权或存储属性合成Objective-C对象的属性.
该错误消失,如果我加入strong,weak或copy以财产.为什么是这样?为什么在只读属性这些东西之间会有任何差异,这些差异是什么,为什么程序员必须担心它们?为什么编译器不能智能地推导出只读属性的默认设置?
我在谈论它的另一个问题:strong,weak或者copy是ARC中唯一有意义的事情,对吧?我不应该使用retain和assign了,要这样呢?
BJ *_*mer 12
你已宣布@property没有支持ivar.因此,当编译器看到时@synthesize,它会尝试为您合成一个支持ivar.但是你还没有说明你想要什么样的伊娃.应该是__strong吗?__weak?__unsafe_unretained?最初,属性的默认存储属性assign是,与__unsafe_unretained.相同.但是,在ARC下,这几乎总是错误的选择.因此,他们需要您指定您想要的ivar类型,而不是合成不安全的ivar.
使用最新版本的Xcode和最近的clang编译器,不再出现此错误.您可以@property(nonatomic, readonly) NSObject *myProperty;在接口中指定属性,在实现中合成它,并假定生成的ivar strong.如果你想要明确或选择弱,你可以在原始属性中这样做,比如@property(nonatomic, readonly, retain).Objective-C逐渐变得不那么冗余.