2011-08-24 68 views
0

我想了解以下行代碼的內存管理的影響:Objective-C的內存管理問題

// in tableView:cellForRowAtIndexPath 
cell.accessoryView = [[UIImageView alloc] initWithImage: 
         [UIImage imageNamed:@"test.png"]; 

我打電話alloc這通常意味着我打電話release地方。 UITableViewCellaccessoryView設置屬性是retain所以(我認爲)該單元將「取得」UIImageView的所有權。 關於內存管理,上面的代碼行究竟發生了什麼?

回答

3

如果你沒有在某個地方釋放視圖,那麼它將被泄漏。所以,你可能想要做

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]; 
cell.accessoryView = imageView; 
[imageView release]; 

,或者您也可以做

cell.accessoryView = [[[UIImageView alloc] initWithImage: 
        [UIImage imageNamed:@"test.png"] autorelease]; 
2

第一:+頁頭保留的UIImageView(或可選擇, 「你開始用的UIImageView的所有權」)

二:+ imageNamed自動釋放的UIImage(或「+ imageNamed不給你的所有權在UIImage的「)

第三:對於accessoryView的二傳手保留的UIImageView(或‘附屬視圖採取的UIImageView’)的所有權

既然你現在有兩個業主爲的UIImageView,這可能泄漏,除非你有意將它放在後面使用,並根據它進行管理ordingly。

1

認爲它是這樣的:你調用分配/初始化,所以你擁有它。當你不想擁有它時,你必須釋放它。

您可以假設cell.accessoryView取得所有權,除非文檔另有說明(如使用委託),因此一旦將其分配給cell.accessoryView,您可能不需要再擁有它。你應該釋放它。

總之,該行至少保留兩次:一次使用alloc/init,至少一次使用cell.accessoryView賦值。你只負責一個版本,一個是alloc/init。