有关ARC中只读@property的问题

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,weakcopy以财产.为什么是这样?为什么在只读属性这些东西之间会有任何差异,这些差异是什么,为什么程序员必须担心它们?为什么编译器不能智能地推导出只读属性的默认设置?

我在谈论它的另一个问题:strong,weak或者copy是ARC中唯一有意义的事情,对吧?我不应该使用retainassign了,要这样呢?

BJ *_*mer 12

你已宣布@property没有支持ivar.因此,当编译器看到时@synthesize,它会尝试为您合成一个支持ivar.但是你还没有说明你想要什么样的伊娃.应该是__strong吗?__weak__unsafe_unretained?最初,属性的默认存储属性assign是,与__unsafe_unretained.相同.但是,在ARC下,这几乎总是错误的选择.因此,他们需要您指定您想要的ivar类型,而不是合成不安全的ivar.

  • `copy`属性将合成`__strong`ivars.你可以在`readonly`属性上声明`copy`的主要原因是你可以在类扩展中重新声明它为`readwrite`; 为了做到这一点,其他一切必须匹配. (6认同)

Pet*_*ese 5

使用最新版本的Xcode和最近的clang编译器,不再出现此错误.您可以@property(nonatomic, readonly) NSObject *myProperty;在接口中指定属性,在实现中合成它,并假定生成的ivar strong.如果你想要明确或选择弱,你可以在原始属性中这样做,比如@property(nonatomic, readonly, retain).Objective-C逐渐变得不那么冗余.