好的,這是我嘗試了很多變體後得到的結果。在上面的代碼中,在問題中,我分配一個圖像,然後將保留計數爲+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.我其實並沒有試圖禁用編譯優化(如果它存在的話)。但是我看過一個視頻,在這個視頻中,靜態分析器也檢測到循環內存泄漏。如果您有興趣,請搜索它。
我假設你沒有使用ARC,是嗎? – dasblinkenlight 2012-01-03 18:21:51
對不起,但是我必須明確地打開它還是默認打開它?我如何檢查? – 2012-01-03 18:26:26
據我所知,從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