2010-06-02 71 views
0

儀器的泄漏告訴我,這UIImage的泄漏:爲什麼這個泄漏的內存? UIImage的`的cellForRowAtIndexPath:`

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png", [postsArrayID objectAtIndex:indexPath.row]]]]; 

// If image contains anything, set cellImage to image. If image is empty, try one more time or use noImage.png, set in IB 
if (image != nil){ 
    // If image != nil, set cellImage to that image 
    cell.cellImage.image = image; 
} 
image = nil; 
[image release]; 

(類細胞(自定義表格視圖單元格)也釋放cellImage在dealloc方法)。

我還沒有知道它爲什麼會泄漏的線索,但它當然是。 圖像在cellForRowAtIndexPath:-方法中多次加載。前三個單元格的圖像不會泄漏(130px高,所有空間都可用)。

泄漏給我沒有其他信息比那個UIImage allocated here in the code leaks

你能幫我弄明白嗎?謝謝:)

+0

,你會在這種情況下使用什麼樣的?這兩者之間有什麼區別:[[UIImage alloc] initWithContentsOfFile:...];和[UIImage imageWithContentsOfFile:...] ;.有沒有什麼區別? – Emil 2010-06-02 20:29:04

回答

5

你就不會有正確的,如果圖像是一個@property的代碼。您可以通過執行self.property = nil來釋放@property,因爲setter的工作方式。 setter釋放舊對象並將ivar設置爲該值。爲了解決這個問題,你需要先放[image release]。這裏發生的是,你將圖像設置爲零,然後你基本上在做[nil release]。舊圖像只是浮在某處。因此,要解決這個問題做到以下幾點:

[image release]; 
image = nil; 
+0

很好的解釋。謝謝。 – Emil 2010-06-02 20:27:48

+0

噢,無論如何將釋放對象設置爲'nil'有什麼意義? – Emil 2010-06-02 20:28:45

+0

主要原因是因爲如果你是由於某種原因調用它的方法,它將不會像EXC_BAD_ACCESS那樣返回。如果您向已發佈的對象發送消息,則只有當@property的setter語義爲「retain」時,您的應用纔會因EXC_BAD_ACCESS而崩潰,原因是 – rickharrison 2010-06-02 20:35:58

3

在致電release之前,您將它設置爲nil。所以你正在發佈nil而不是image

變化來自:

image = nil; 
[image release]; 

到:

[image release]; 
image = nil; 
+0

哦,我沒有意識到這可能會導致泄漏..!謝謝:) – Emil 2010-06-02 20:25:35

+0

你會在這種情況下使用什麼?這兩者之間有什麼區別:'[[UIImage alloc] initWithContentsOfFile:...];''和'[UIImage imageWithContentsOfFile:...];'。有沒有什麼區別? – Emil 2010-06-02 20:26:47

+1

不是我真的知道的。 'imageWithContentsOfFile'是一種方便的方法。所以它負責釋放圖像。如果你調用alloc,那麼你有責任。你可以在這裏的蘋果內存管理指南閱讀有關它:http://developer.apple.com/mac/library/documentation/cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html – 2010-06-02 20:29:27

0

點點代碼修改

UIImage *image = [[UIImage alloc] initWithContentsOfFile:[imagesPath 
     stringByAppendingPathComponent:[NSString stringWithFormat:@"/%@.png", 
     [postsArrayID objectAtIndex:indexPath.row]]]]; 

if (image){ 
    cell.cellImage.image = image; 
    [image release];