在我的界面(.h)文件中,我有
@property(readonly) NSString *foo;
在我的实现(.m)文件中,我有
@synthesize foo;
启用ARC后,编译器会给出以下错误:自动引用计数问题:ARC禁止使用未指定的所有权或存储属性合成Objective-C对象的属性。
如果我向该属性添加strong
,weak
或copy
,则该错误消失了。为什么是这样?为什么只读属性在这些事情之间会有任何差异,这些差异是什么,为什么程序员必须担心它们?为什么编译器不能智能地推导出只读属性的默认设置?
我遇到的另一个问题:strong
,weak
或copy
是ARC中唯一有意义的事情,对吧?我不应该再使用retain
和assign
,我可以吗?
答案 0 :(得分:12)
您已声明@property
没有支持ivar。因此,当编译器看到@synthesize
时,它会尝试为您合成一个支持ivar。但是你还没有说明你想要什么样的伊娃。它应该是__strong
吗? __weak
? __unsafe_unretained
?最初,属性的默认存储属性为assign
,与__unsafe_unretained
相同。但是,在ARC下,这几乎总是是错误的选择。因此,他们不需要合成不安全的ivar,而是要求您指定所需的ivar。
答案 1 :(得分:5)
使用最新版本的Xcode和最近的clang编译器,不再出现此错误。您可以在接口中将属性指定为@property(nonatomic, readonly) NSObject *myProperty;
,在实现中将其合成,并且假定生成的ivar为strong
。如果您想要明确或选择弱,您可以在原始属性中执行此操作,例如@property(nonatomic, readonly, retain)
。 Objective-C逐渐变得不那么多余了。
答案 2 :(得分:2)
这是对其余代码的声明 当您从代码的其他部分访问此类的属性时,您需要知道您获得的对象是强还是弱。
当ARC不存在时,过去更为明显,因为程序员需要这些信息。现在,ARC使很多东西变得透明,所以你可能想知道它为什么还在这里。
为什么编译器不能智能地推断出只读属性的默认设置?
我认为设置惯例很容易,没有关键字意味着strong
或意味着weak
。如果还没有完成,他们肯定有理由。