2013-08-16 72 views
0

我編寫了測試代碼來檢查如何使用儀器(泄漏)。我創建了一個單一視圖的應用程序,並點擊一個按鈕我已加載這樣一個新的觀點...使用儀器(泄漏)檢測C泄漏

- (IBAction)btn_clkd:(id)sender { 
    new_file *new = [[new_file alloc] init]; 

    if (new) { 
     [self.navigationController pushViewController:new animated:YES]; 
     new = nil; 
    } 
} 

在NEW_FILE viewDidLoad方法中,我已創建像下面泄漏...

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    char *c_mem = (char*) malloc(10000000); 
    strcpy(c_mem, "TESTING"); 
    // free(c_mem); 
} 

即使我使用ARC,分配的內存是一個普通的C malloc,並且在使用後我還沒有釋放內存,即使我一次又一次彈出並加載了新視圖,樂器(泄漏)未檢測到任何泄漏這段代碼...是什麼原因,我檢查正確嗎?

感謝名單

回答

1

鑑於您的視圖控制器已被釋放(請驗證),最終泄漏將檢測到c_mem指針泄漏。

儀器可能不會立即發現此 - 由於其用於檢測泄漏的算法。

該算法基本上搜索未引用變量看起來像指向堆中的指針。如果發生有一個任意可變的,說p,其值恰好是c_mem值 - 然後儀器認爲該指針c_mem仍然從p引用 - 即使p可能只包含任意數據,不包含c_mem

請注意,儀器泄漏檢測算法實際上更復雜,並且可能會改變並得到改進。

爲了找到泄漏,我總是在一個循環中運行特殊的代碼 - 比如單元測試。如果使用的內存不能及時增長,通常情況下會好。您還可以使用Leaks的「Snapshot」功能和Allocations的「Mark Generation」功能來檢查堆的當前狀態。

0

當你取出你的ViewController,若無其事引用它,它會自動通過ARC與它的所有變量釋放。這就是爲什麼你不會泄漏。

看看你的控制器在使用泄漏儀器彈出時會發生什麼。你也可以看到它的一些參考。檢測保留週期也非常方便。

Here是如何使用儀器的完整參考。

+0

但是,這裏泄漏的是使用malloc的C方式...將ARC處理這也.. – Newbee

+0

變量的作用域是類的方法。這就是爲什麼我認爲這些變量在方法結束後被銷燬的原因。 – wzbozon

+0

你是對的變量會被銷燬,但我猜不是動態分配的內存。 – Newbee