【发布时间】:2012-05-22 01:25:17
【问题描述】:
总的来说,我是 iOS 开发的新手,从未处理过手动引用计数(保留、释放、自动释放)。因此,我对魔法 ARC 的表现不是很了解。
我以为我明白了,直到有人问我应该将哪种类型的所有权(weak、strong、assign 等)赋予指向对象的只读属性,例如:
@property (readonly,nonatomic) NSString* name;
我在这里读到
Questions about a readonly @property in ARC 离开 strong/weak 不会实际编译,除非您在 @synthesize 属性时指定支持变量;我只是碰巧指定了一个像这样的支持 ivar:
@synthesize name = _name;
现在我了解到变量的默认“生命周期限定符”很强大,来自这里:http://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW4
长话短说 - 我间接将我的属性定义为(readonly,nonatomic,strong),因为_name ivar 被隐式声明为__strong。
我有几个问题:
strong是要使用的正确生命周期限定符吗?我假设是这样,否则支持我的NSString*的对象将不会在任何地方拥有,因此会被自动释放(来自 Java 领域,这是有道理的,因为默认情况下所有引用都是强引用)。在这种情况下是否还有其他有意义的修饰符,例如
copy或assign?将属性声明为
(readonly,nonatomic,strong)和(readonly,nonatomic)对使用该属性的代码有什么影响吗?例如。在没有strong关键字的情况下声明它会导致对象指针存储为__unsafe_unretained,而strong属性将存储在__strong指针中?
谢谢!
编辑
据我所知,以下适用于只读属性:
- 对于非 NSObject* 类型(int、float、void* 等),请使用
(readonly, assign)。 - 对于对象指针,请使用
(readonly, strong)或(readonly, copy)- 这些功能对于只读属性相同,但如果您扩展/子类并将属性重新声明为readwrite,您可能需要复制语义。 - 对于对象指针,
(readonly, weak)仅在您要在该属性中存储一个已经很弱的指针时才有意义(该指针在其他地方必须是强指针,否则该对象将被释放)。
【问题讨论】:
-
请注意,“strong”是隐含的,因此如果您使用
(strong)扩展只读指定的(readonly),它将起作用,但(copy)不会。相反,您会看到“ARC 禁止综合属性......具有未指定的所有权或存储属性。”在这种情况下,您需要在标头定义中明确说明(readwrite, copy)。这让我绊倒了几分钟。
标签: objective-c object properties automatic-ref-counting readonly