Objective c 关于ARC中readonly@属性的问题
在我的接口(.h)文件中,我有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,错误就会消失。为什么会这样?为什么只读属性
@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
默认情况下隐式包含