为什么Objective-C对象在被解除分配后仍然存在?

时间:2011-01-27 17:04:03

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

我这里有这段代码......

#import <Foundation/Foundation.h>
#import "Chip.h"

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    Chip *chip = [[Chip alloc] init];

    [chip release]; //Chip should be gone

    NSLog(@"%@", chip);

    [pool drain];
    return 0;
}

为什么在芯片发布后打印出来的芯片仍然给我描述。此时是否应该删除?

3 个答案:

答案 0 :(得分:5)

chip 已消失。你只是和鬼魂说话。

添加记录呼叫的dealloc覆盖。您应该看到释放按预期发生。该对象被释放,但没有其他任何事情发生在垃圾桶中,并且你的电话不会侵入它会导致麻烦的地方。

答案 1 :(得分:0)

行:[comp setChip:chip];将芯片的保留计数增加到2,因为comp现在也保留芯片,所以当你释放芯片时,它的保留计数仍为1.

答案 2 :(得分:0)

据我所知,在自动释放池耗尽之前,该对象仍然存在,它只是保留计数为零,因此可以删除。 (实际上你说你不再对这个对象感兴趣了,可以删除它。)

顺便提一下,虽然稍微偏离主题,但如果您使用NSZombieEnabled,您将能够看到尝试使用已发布对象时会发生什么的实际演示。