2011-04-17 46 views
0

釋放圖像時,我會通過對iPhone表視圖的教程。以下是填充表格的數據源方法。崩潰中的UITableViewCell

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{ 
    static NSString* SimpleTableIdentifier = @"SimpleTableIdentifier"; 
    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:SimpleTableIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:SimpleTableIdentifier] autorelease]; 
    } 
    NSUInteger row = [indexPath row]; 
    cell.textLabel.text = [listData objectAtIndex:row]; 
    UIImage* image = [UIImage imageNamed:@"face.png"]; 
    cell.imageView.image = image; 
    //[image release]; 
    return cell; 
} 

我注意到作者在將它設置爲表格單元格的圖標後沒有釋放圖像。源代碼定義UITableCell.imageView.image確實,事實上,表明它是一個保留的屬性。如果我不釋放自己的圖像副本,則在方法結束時保留計數最終爲2。所以我決定釋放它來釋放內存。但是,這樣做會導致iPhone模擬器在我將桌面略微滑離屏幕時崩潰。爲什麼?

回答

2

方法imageNamed:是一個方便的方法。換句話說,圖像資源爲autoreleased。如果您嘗試釋放該對象,則您已將其過度釋放。

編輯:的內存管理的規則如下:當你打電話allocnewcopy,或retain,則必須調用releaseautorelease

+0

假設每當我構造一個沒有'alloc'的對象時,它是一個自動釋放對象嗎? – JoJo 2011-04-17 03:17:57

+0

@JoJo - 偉大的問題 - 請參閱我的編輯。 – Moshe 2011-04-17 03:19:58

1

-imageNamed:方法返回一個autoreleased圖像。因此,你不需要自己釋放它。

的代碼行:cell.imageView.image = image;需要需要做圖像的固定的護理。

請記住,如果您調用retain或使用alloc或其中包含單詞「new」或「copy」的方法創建該對象,則應該只對對象調用release或autorelease。在其他情況下(假定他們是做正確的事情,你必須假定他們是),則返回會被自動釋放的對象。

相關問題