Objective c 关于ARC中readonly@属性的问题

Objective c 关于ARC中readonly@属性的问题,objective-c,cocoa,automatic-ref-counting,Objective C,Cocoa,Automatic Ref Counting,在我的接口(.h)文件中,我有 @property(readonly) NSString *foo; @synthesize foo; 在我的实现(.m)文件中 @property(readonly) NSString *foo; @synthesize foo; 启用ARC时,编译器会给出以下错误:自动引用计数问题:ARC禁止合成具有未指定所有权或存储属性的Objective-C对象的属性。 如果我在属性中添加strong、weak或copy,错误就会消失。为什么会这样?为什么只读属性

在我的接口(.h)文件中,我有

@property(readonly) NSString *foo;
@synthesize foo;
在我的实现(.m)文件中

@property(readonly) NSString *foo;
@synthesize foo;
启用ARC时,编译器会给出以下错误:自动引用计数问题:ARC禁止合成具有未指定所有权或存储属性的Objective-C对象的属性。

如果我在属性中添加
strong
weak
copy
,错误就会消失。为什么会这样?为什么只读属性的这些东西之间会有任何区别,这些区别是什么,程序员为什么要担心它们?为什么编译器不能智能地推断只读属性的默认设置


还有一个问题是:
strong
weak
copy
是ARC中唯一有意义的东西,对吗?我不应该再使用
retain
assign
了,是吗?

这是对代码其余部分的声明。
当您从代码的其他部分访问这个类的属性时,您需要知道您得到的对象是强对象还是弱对象

当ARC不存在时,这一点更为明显,因为程序员需要这些信息。现在,ARC使很多东西透明,所以这是真的,你可能想知道为什么它还在这里


为什么编译器不能智能地推断只读属性的默认设置


我假设很容易设置约定,没有关键字表示
strong
。如果没有这样做,他们肯定有原因。

您声明了一个没有支持ivar的
@属性。因此,当编译器看到
@synthesis
时,它会尝试为您合成一个支持ivar。但是你还没有指定你想要什么样的ivar。它应该是
\u\u strong
<代码>\u弱
<代码>\u不安全\u未恢复?最初,属性的默认存储属性是
assign
,它与
\uuu unsafe\u unrepeated
相同。然而,在ARC下,这几乎总是错误的选择。因此,它们要求您指定所需的ivar类型,而不是合成不安全的ivar。

对于最新版本的Xcode和最新的clang编译器,此错误不再发生。您可以将属性指定为
@property(非原子,只读)NSObject*myProperty代码,在实现中对其进行合成,并假设生成的ivar为
strong
。如果希望显式或选择弱,可以在原始属性中执行,如
@property(非原子、只读、保留)
。Objective-C正逐渐减少冗余。

啊,现在它开始有了一些意义。但是如果我指定
copy
(对于
readwrite
属性),生成的ivar是
\uuuuu-strong
还是
\uu-strong
?(实际上,
copy
也为
readonly
属性编译,这对我来说有点奇怪。)
copy
属性将合成
\uu-strong-strong-code>ivar。您可以在
readonly
属性上声明
copy
的主要原因是,您可以在类扩展中将其重新声明为
readwrite
;为了做到这一点,其他所有内容都必须匹配。
@synthetic
默认情况下隐式包含