2009-12-11 89 views
2

我仍然對內存管理的一些微妙方面感到不安,我有一個關於我在某些示例代碼中看到的積極保留/釋放的問題。具體做法是:iPhone內存管理問題:保留迭代的UITableViewCells?

- (void)loadContentForVisibleCells 
{ 
    NSArray *cells = [self.tableView visibleCells]; 
    [cells retain]; 
    for (int i = 0; i < [cells count]; i++) 
    { 
     // Go through each cell in the array and call its loadContent method if it responds to it. 
     FlickrCell *flickrCell = (FlickrCell *)[[cells objectAtIndex: i] retain]; 
     [flickrCell loadImage]; 
     [flickrCell release]; 
     flickrCell = nil; 
    } 
    [cells release]; 
} 

爲什麼[保留/釋放]關於FlickrCell(線8 & 10)週期?單元格在NSArray中,根據定義,它保留了其內容(我認爲...?),並保留了NSArray本身。爲什麼這些額外的保留是必要的?

此外,爲什麼保留在[self.tableView visibleCells](第3行)返回的NSArray上?在這個方法調用期間,數組是否保證不在?

非常感謝。

回答

2

在這種情況下,retain/release不是必需的,因爲返回的單元格實際上是自動釋放的。 cells陣列上的額外retain/release也是如此。

您可以安全地刪除代碼段中的所有retainrelease調用,以執行正確的內存管理。

另外請注意,這並沒有太大的性能損失。 retainrelease調用只是遞增和遞減實例的保留計數。

一般來說,每次調用alloccopyretain時候你應該叫releaseautorelease。如果您不撥打alloc,copyretain,則不需要使用releaseautorelease。所有的Cocoa方法(以及所有Objective-C框架)都會返回自動釋放的對象實例,以便該代碼不必看起來像你的代碼片段。

如果您想了解Objective-C中內存管理的更多信息,建議您通過Memory Management Programming Guide進行閱讀。

+0

好的,謝謝。我覺得我對內存管理有相當的瞭解,但是當我看到這樣的代碼時,我開始懷疑。 – 2009-12-11 22:05:56