保留和复制之间的区别?

时间:2011-01-28 10:34:26

标签: objective-c reference copy retain counting

保留和复制有什么区别?它对引用计数有何意义?

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

与此相关的另一个问题是,使用
之间的区别 @property(非原子,保留)和@property(非原子,复制)?

3 个答案:

答案 0 :(得分:10)

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

复制 - 创建一个新对象

答案 1 :(得分:3)

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

retain - “指定在赋值时应该在对象上调用retain。...之前的值会发送一条释放消息。”所以你可以设想分配一个NSString实例(它是一个对象,你可能想要保留它)。因此保留计数增加1。

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

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

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

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

我希望有所帮助。我在这里发现了另一篇可能对你有帮助的帖子。

Objective C - Assign, Copy, Retain

干杯! 何

答案 2 :(得分:2)

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

但是,对于不可变对象, copy 相当于 retain ,它必须将原始对象的引用计数增加1。 / p>