这两个Objective-C消息表达式是否等同于内存?

时间:2011-08-30 18:47:23

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

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

示例1:

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

示例2:

iVar = [[Foo aClassMethodInFoo] retain];

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:2)

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