【问题标题】:Are these two Objective-C message expressions equivalent memory-wise?这两个 Objective-C 消息表达式在内存方面是否等效?
【发布时间】:2011-08-30 18:47:22
【问题描述】:

以下两个消息表达式是否会导致同一对象中的保留计数增加?

示例 1:

iVar = [Foo aClassMethodInFoo];
[iVar retain];

示例 2:

iVar = [[Foo aClassMethodInFoo] retain];

示例 1 是明确的,因为它是 iVar 实例,其保留计数增加了。 示例 2 似乎表明从 [Foo aClassMethodInFoo] 返回的对象的保留计数增加了。如果是这样,那么假设aClassMethodInFoo 是一种方便的方法,我应该“释放”哪个对象来平衡早期的“保留”以避免内存泄漏?

【问题讨论】:

    标签: objective-c memory-management memory-leaks


    【解决方案1】:

    两者完全相同。在第一种情况下,您将方法调用的结果分配给一个变量,然后对该变量调用-retain。最终结果是变量保存了对象,并且您在对象上调用了-retain。在第二种情况下,您在方法调用的结果上调用-retain,并将结果分配给变量。由于-retain 保证会返回其接收者,因此最终结果是变量保存了对象,并且您在对象上调用了-retain

    在这两种情况下,内存语义完全相同。根据Memory Management Programming Guide 中定义的命名约定,名为+aClassMethodInFoo 的方法返回一个自动释放的对象,因此如果您将结果存储在ivar 中,您对-retain 的调用是正确的。因此,完成后,您可以在 ivar 上调用 -release。您关于“我要‘释放’哪个对象”的问题是荒谬的,因为这里只有一个对象。

    【讨论】:

      【解决方案2】:

      假设类方法返回一个新对象而不是void,它们是完全等价的,因为retain只是返回self。

      【讨论】:

      • 是的,类(方便)方法假定返回一个新对象。
      • 即使它没有返回一个新对象,它们仍然是一样的。
      猜你喜欢
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      • 2019-04-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      • 1970-01-01
      相关资源
      最近更新 更多