【问题标题】:How do I find out if I need to retain or assign an property?我如何确定我是否需要保留或转让财产?
【发布时间】:2010-10-21 14:01:48
【问题描述】:

有什么好的规则可以学习什么时候应该使用retain,什么时候assign?

【问题讨论】:

  • 下面的优秀答案。如果您可以将其标记为已接受,那就太好了。

标签: objective-c iphone cocoa-touch


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为,在处理对象时,您几乎总是使用保留而不是分配,而在处理原始类型、结构等时,您将使用分配(因为您不能保留非对象)。那是因为您希望具有属性的对象决定何时使用该对象,而不是其他东西。 Apple 的内存管理指南指出:

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

    有关使用复制与保留的讨论,请参阅this SO question

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-06
          • 2012-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-09-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多