【发布时间】:2010-10-21 14:01:48
【问题描述】:
有什么好的规则可以学习什么时候应该使用retain,什么时候assign?
【问题讨论】:
-
下面的优秀答案。如果您可以将其标记为已接受,那就太好了。
标签: objective-c iphone cocoa-touch
有什么好的规则可以学习什么时候应该使用retain,什么时候assign?
【问题讨论】:
标签: objective-c iphone cocoa-touch
Assign 用于原始值,如 BOOL、NSInteger 或 double。对于对象,请使用保留或复制,具体取决于您是要保留对原始对象的引用还是复制它。
唯一常见的例外是弱引用,您希望保留指向对象的指针,但由于引用循环而无法保留它。这方面的一个例子是委托模式,其中一个对象(例如一个表格视图)保持一个指向其委托的指针。由于委托对象保留了表视图,让表视图保留委托将意味着任何一个都不会被释放。在这种情况下使用弱引用代替。在这种情况下,您将在创建属性时使用 assign。
【讨论】:
我认为,在处理对象时,您几乎总是使用保留而不是分配,而在处理原始类型、结构等时,您将使用分配(因为您不能保留非对象)。那是因为您希望具有属性的对象决定何时使用该对象,而不是其他东西。 Apple 的内存管理指南指出:
有时候你不想要 收到的待处理物品;为了 例如,您可能需要缓存 实例变量中的对象。在 这种情况,只有你知道什么时候 不再需要对象,所以你 需要电源来确保 对象没有被处理,而你 仍在使用它。你这样做 保留消息,保持效果 挂起的自动释放(或抢占 稍后发布或自动发布 信息)。通过保留一个对象,您 确保它不会被释放 直到你完成它。
有关使用复制与保留的讨论,请参阅this SO question。
【讨论】:
我知道这是一个老问题,但我从 uber 大师 Matt Gallagher 那里找到了这些指南,非常有用:http://cocoawithlove.com/2009/07/rules-to-avoid-retain-cycles.html。就我而言,我有一个我自己制造的“保留地狱”,因为有一个对父对象的 hard 引用。
【讨论】:
如果您打算保留对象并使用它,请使用保留。否则,它可能会被释放,最终导致代码出错。
【讨论】: