2011-01-27 108 views
2

我这里有这个代码...为什么Objective-C对象在交易后仍然存在?

#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; 
} 

为什么打印出来后发布的芯片仍然给我描述。在这一点上不应该被删除?

回答

5

chip没了。你只是在跟鬼魂说话。

添加一个dealloc覆盖,记录呼叫。您应该看到,释放按预期发生。该对象被释放,但没有其他发生垃圾内存和你的电话发生不会侵入哪里会造成麻烦。

0

行:[comp setChip:chip];递增保留芯片的数量为2,因为补偿是现在还保留芯片,所以当你松开芯片,但它仍然有1

+0

没有。 OP明确指出`setChip`只能分配。 – walkytalky 2011-01-27 17:11:00

+5

释放的内存还没有被覆盖,并且仍然包含相同的字节以进行记录。 – Richard 2011-01-27 17:12:02

+0

@walkytalky:啊,你说得对,我错过了原帖。我觉得他的二传手实施仍在继续。 – Matt 2011-01-27 17:16:45

0

一个保留计数至于我m意识到,直到自动释放缓冲池已经耗尽,对象将仍然存在,它只会有一个保留计数为零,因此可以删除。 (实际上你是说你不再对这个对象感兴趣,并且它可以被删除。)

顺便说一下,虽然有点偏离主题,但如果你使用NSZombieEnabled,你将能够以查看尝试使用发布的对象时发生的情况的实际演示。

相关问题