2011-01-27 165 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,你將能夠以查看嘗試使用發佈的對象時發生的情況的實際演示。

相關問題