以下两个消息表达式是否会导致同一对象中的保留计数增加?
示例1:
iVar = [Foo aClassMethodInFoo];
[iVar retain];
示例2:
iVar = [[Foo aClassMethodInFoo] retain];
示例1是明确的,因为它是保留计数增加的iVar实例。
示例2似乎表明它保留了从[Foo aClassMethodInFoo]
返回的对象的保留计数。如果是这样,那么假设aClassMethodInFoo
是一种方便的方法,我会'释放'哪个对象以平衡先前的'保留'以便不泄漏内存?
答案 0 :(得分:6)
两者完全相同。在第一种情况下,您将方法调用的结果分配给变量,然后在该变量上调用-retain
。最终结果是变量保存了对象,并且您在对象上调用了-retain
。在第二种情况下,您在方法调用的结果上调用-retain
,并将结果分配给变量。由于-retain
保证返回其接收者,因此最终结果是变量保存对象,并且您在对象上调用了-retain
。
在这两种情况下,内存语义完全相同。根据{{3}}中定义的命名约定,名为+aClassMethodInFoo
的方法返回一个自动释放的对象,因此如果您将结果存储在ivar中,则对-retain
的调用是正确的。因此,当您完成后,您可以在您的ivar上拨打-release
。你的“我要释放哪个对象”的问题是荒谬的,因为这里只有一个对象。
答案 1 :(得分:2)
假设class方法返回一个新对象而不是void,它们完全等效,因为retain只返回self。