2012-01-03 39 views
0

我使用的Xcode 4,下面是我想對靜態分析的最簡單的捕殺的一個嚴重的內存泄露:靜態分析儀停止檢測未發佈的分配

-(void)leak:(id)sender{ 
images=[[NSMutableArray alloc] init]; 
for (int i=0; i<=2000; i++) { 
    UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle 
mainBundle]pathForResource:@"Icon" ofType:@"png"]]; 
    [images addObject: image]; 
} 
} 

但是,當我選擇產品|分析儀不抓住任何東西我是否對Xcode做過任何意外的更改?或者這是真的應該如何?

+2

我假設你沒有使用ARC,是嗎? – dasblinkenlight 2012-01-03 18:21:51

+0

對不起,但是我必須明確地打開它還是默認打開它?我如何檢查? – 2012-01-03 18:26:26

+0

據我所知,從XCode 4.2開始,對於選擇「使用自動引用計數」的新項目,ARC打開。以下是關於[如何關閉它的信息](http://matthiaswessendorf.wordpress.com/2011/09/12/disabling-the-arc-in-xcode-4-2/)。 – dasblinkenlight 2012-01-03 18:30:44

回答

0

好的,這是我嘗試了很多變體後得到的結果。在上面的代碼中,在問題中,我分配一個圖像,然後將保留計數爲+1的圖像放入圖像數組中,從而保留圖像,從而導致保留計數爲+2。理想情況下,我必須在將圖像對象添加到數組後將其釋放。但我不知道,這是一個明顯的內存泄漏。但奇怪的靜態分析器無法捕捉到這個泄漏。 現在,這裏是抓住。代碼在for循環中。如果我把它放在循環之外,分析儀會檢測它。所以我認爲這與編譯優化有關,它沒有注意到循環內的危險。

這是另一個問題。儘管分析儀可以檢測到泄漏,但如果我在儀器上進行測試,仍然無法檢測到泄漏。也很奇怪,不是嗎?好的,這是爲什麼。這是因爲如果有任何對物體的引用,儀器不會顯示泄漏。所以,我給你兩種情況對比:

images=[[NSMutableArray alloc] init]; 
    UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle 
    mainBundle]pathForResource:@"Icon" ofType:@"png"]]; 
    [images addObject: image]; 

這樣的靜態分析儀將捕獲內存泄漏(注意代碼不是在一個循環內)。但樂器不會。但是,如果我再添加一行代碼:

images=[[NSMutableArray alloc] init]; 
    UIImage *image=[[UIImage alloc] initWithContentsOfFile:[[NSBundle 
    mainBundle]pathForResource:@"Icon" ofType:@"png"]]; 
    [images addObject: image]; 

    [images release]; 

然後將不會有擁有圖像對象的對象,因此它將四處漂浮。這樣儀器也會檢測到泄漏。

我知道上述情況在真實世界的應用程序中幾乎是不可能的,但它是用於演示目的的示例,因此您不會感到困惑。

P.S.我其實並沒有試圖禁用編譯優化(如果它存在的話)。但是我看過一個視頻,在這個視頻中,靜態分析器也檢測到循環內存泄漏。如果您有興趣,請搜索它。

相關問題