如何确定是否需要保留或分配财产?

时间:2009-04-24 10:43:25

标签: objective-c iphone cocoa-touch

当我应该使用retain时,以及在分配时,是否有任何好的规则可供学习?

4 个答案:

答案 0 :(得分:53)

分配用于原始值,如BOOL,NSInteger或double。对于对象,使用保留或复制,具体取决于您是要保留对原始对象的引用还是复制它。

唯一常见的例外是弱引用,您希望保留指向对象的指针,但由于引用周期而无法保留它。一个例子是委托模式,其中一个对象(例如表视图)保持指向其委托的指针。由于委托对象保留了表视图,因此让表视图保留委托将意味着不会释放任何一个。在这种情况下使用弱引用。在这种情况下,您可以在创建属性时使用assign。

答案 1 :(得分:4)

我认为在处理对象时,你几乎总是使用retain而不是assign,当使用原始类型,结构等时,你会使用assign(因为你不能保留非对象)。那是因为你希望具有属性的对象决定何时完成对象,而不是其他东西。 Apple的内存管理指南说明了这一点:

  

有些时候你不想要   收到的待处理对象;对于   例如,您可能需要缓存   实例变量中的对象。在   这种情况下,只有你知道的时候了   不再需要对象,所以你   需要力量来确保   你没有处置对象   仍在使用它。你这样做了   保留消息,保持效果   挂起的自动释放(或抢占   稍后发布或自动发布   信息)。通过保留你的对象   确保它不会被解除分配   直到你完成它。

有关使用copy vs retain的讨论,请参阅this SO question

答案 2 :(得分:4)

我知道这是一个老问题,但我从 uber 大师Matt Gallagher那里找到了这些指南,非常有用:http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html。在我的情况下,我有一个“保留地狱”我自己制作了一个引用父对象。

答案 3 :(得分:0)

如果您打算保留该对象并使用它,请使用retain。否则,它可能会被释放,您的代码最终会出错。