Glo*_*mad 2 memory-leaks memory-management objective-c
以下两个消息表达式是否会导致同一对象中的保留计数增加?
例1:
iVar = [Foo aClassMethodInFoo];
[iVar retain];
Run Code Online (Sandbox Code Playgroud)
例2:
iVar = [[Foo aClassMethodInFoo] retain];
Run Code Online (Sandbox Code Playgroud)
示例1是明确的,因为它是保留计数增加的iVar实例.示例2似乎表明它从中返回的对象的保留计数[Foo aClassMethodInFoo]增加了.如果是这样,那么假设aClassMethodInFoo是一种方便的方法,我会释放哪个对象以平衡先前的"保留"以便不泄漏内存?
两者完全相同.在第一种情况下,您将方法调用的结果分配给变量,然后调用-retain该变量.最终结果是变量保存了对象,并且您已调用-retain该对象.在第二种情况下,您将调用-retain方法调用的结果,并将结果分配给变量.由于-retain保证返回其接收器,因此最终结果是变量保存对象,并且您已调用-retain该对象.
在这两种情况下,内存语义都完全相同.根据" 内存管理编程指南"中定义的命名约定,一个名为的方法+aClassMethodInFoo返回一个自动释放的对象,因此-retain如果将结果存储在ivar中,则调用是正确的.因此,当你完成后,你可以打电话-release给你的伊娃.你的"我要释放哪个对象"的问题是荒谬的,因为这里只有一个对象.