当我应该使用retain时,以及在分配时,是否有任何好的规则可供学习?
答案 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。否则,它可能会被释放,您的代码最终会出错。