2010-04-26 69 views
3

我總是對內存泄漏非常挑剔,我不明白爲什麼我的垃圾收集應用程序泄漏。我的代碼完全由內存管理,運行良好,沒有垃圾收集,也沒有一次泄漏。但是,只要我打開垃圾收集器就會泄漏!垃圾收集泄漏?腳本橋樑泄漏?

只是爲了證明一個觀點,爲什麼會在垃圾回收應用程序中泄漏? (發生在在applicationDidFinishLaunching :)

NSOpenPanel *panel = [NSOpenPanel openPanel]; 
[panel beginSheetModalForWindow:window completionHandler:^(NSInteger result) {NSBeep();}]; 

而且,這個假代碼是有辦法阻止應用程序(垃圾回收使用腳本橋泄漏或其他)?好像它們全都泄漏,甚至是xcode中的示例。

謝謝大家!

+2

你用什麼來測量泄漏?什麼在泄漏? – 2010-04-26 03:09:34

回答

2

這是部分答案。

在大多數託管語言中,每個能夠保存對另一個對象的引用的結構都會嵌入偏移量可以保存內存地址的信息。例如,在每個堆棧框架中,都有一個地方告訴垃圾收集器在哪裏查找地址。

像Objective-C這樣的基於C語言沒有這個功能。

對於程序的正確性,最好有一個太多的對象,而不是太早釋放對象。因此,Objective-C中的垃圾收集器查找看起來像地址的模式,但無法確定它們是否確實是地址。這可能(並且幾乎是)會導致引用的誤報(並且與您可以在C中使用的某些內存管理技術不兼容)。因此,某些對象可能會超過其有效性,直到某個隨機整數不再存在。

另外,你怎麼知道什麼是泄漏?您是僅僅比較內存佔用情況,還是通過「泄漏」工具檢查它們?您是否嘗試過'GC Monitor'樂器?

0

對不起,我忘了提及它,我使用儀器中的「泄漏」儀器。有我看到泄漏的地方。我還沒有嘗試過「GC Monitor」儀器。泄漏很小,我不能用擴展的細節追溯到我的代碼。

我一直以舊式的方式完成自己的記憶管理,所以本質上我是GC新手。

所以這與GC模式是正常的?我應該忽略它嗎?

相關問題