4

保留和复制之间到底有什么区别?它对引用计数有什么意义?

我知道当使用 alloc/retain 分配对象时,引用计数会增加 1。那么如何使用副本?

与此相关的另一个问题是,使用
@property(nonatomic, retain) 和@property(nonatomic,copy) 之间的区别?

4

3 回答 3

10

保留——在创建的对象上完成,它只是增加引用计数。

复制——创建一个新对象

于 2011-01-28T11:13:18.473 回答
3

尽我所知回答你的问题。首先,保留和复制之间到底有什么区别?它对引用计数有什么意义?

保留 - “指定在分配时应在对象上调用保留。......先前的值被发送释放消息。” 所以你可以想象分配一个 NSString 实例(它是一个对象并且你可能想要保留它)。所以保留计数增加了 1。

复制 - “指定应使用对象的副本进行分配。......先前的值被发送释放消息。” 与retain基本相同,但发送-copy而不是-retain。如果我没记错的话,计数也会增加 1。

好的,现在进入更多细节。

属性属性是特殊的关键字,用于告诉编译器如何生成 getter 和 setter。这里你指定了两个属性属性:nonatomic,告诉编译器不要担心多线程,retain,告诉编译器在设置实例变量之前保留传入的变量。

在其他情况下,您可能希望使用“assign”属性而不是 retain,这会告诉编译器 NOT!保留传入的变量。或者也许是“复制”属性,它在设置之前复制传入的变量。

我希望这会有所帮助。我在这里找到了另一个帖子,它也可能对您有所帮助。

目标 C - 分配、复制、保留

干杯! 何塞

于 2012-03-16T14:57:55.023 回答
2

一般来说,copy创建一个与原始对象具有相同值的新对象,并将新创建的对象的引用计数设置为1(顺便说一下,原始对象的引用计数不受影响)。

但是,对于不可变对象来说,它copy是等价retain的,它只是将原始对象的引用计数增加 1。

于 2013-05-07T04:31:23.320 回答