有关ARC中只读@property的问题

时间:2012-01-03 18:19:52

标签: objective-c cocoa automatic-ref-counting

在我的界面(.h)文件中,我有

@property(readonly) NSString *foo;

在我的实现(.m)文件中,我有

@synthesize foo;

启用ARC后,编译器会给出以下错误:自动引用计数问题:ARC禁止使用未指定的所有权或存储属性合成Objective-C对象的属性。

如果我向该属性添加strongweakcopy,则该错误消失了。为什么是这样?为什么只读属性在这些事情之间会有任何差异,这些差异是什么,为什么程序员必须担心它们?为什么编译器不能智能地推导出只读属性的默认设置?

我遇到的另一个问题:strongweakcopy是ARC中唯一有意义的事情,对吧?我不应该再使用retainassign,我可以吗?

3 个答案:

答案 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。如果还没有完成,他们肯定有理由。