2011-04-01 123 views
1
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *TelephoneCellId = @"TelephoneCellId"; 

    UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:TelephoneCellId]; 

    UIImageView *imgView; 
    UILabel *lblName; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TelephoneCellId] autorelease]; 

     UIView *uiview = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 90.0)]; 

     imgView = [[[UIImageView alloc] initWithFrame:CGRectMake(10.0, 10.0, 60.0, 60.0)] autorelease]; 
     imgView.tag = IMAGE_TAG; 
     [uiview addSubview:imgView]; 

     lblName = [[[UILabel alloc] initWithFrame:CGRectMake(80.0, 10.0, 200.0, 20.0)] autorelease]; 
     lblName.tag = NAME_TAG; 
     [uiview addSubview:lblName]; 

     [cell.contentView addSubview:uiview]; 
     [uiview release]; 
    } else { 
     imgView = (UIImageView *)[cell.contentView viewWithTag:IMAGE_TAG]; 
     lblName = (UILabel *)[cell.contentView viewWithTag:NAME_TAG]; 
    } 

    NSDictionary *dict = [[[self.telephoneList objectForKey:[self.keys objectAtIndex:[indexPath section]]] objectAtIndex:[indexPath row]] retain]; 
    imgView.image = [UIImage imageNamed:[dict objectForKey:@"image"]]; 

    lblName.text = [dict objectForKey:@"name"]; 

    [dict release]; 
    return cell; 
} 

在上面的代碼中,我得到了有關保留和自動釋放的問題。如果從que返回的UITableViewCell爲零,那麼我必須創建一個新的。當我這樣做時,我會自動釋放標籤和圖像。然後我設置文字/圖像。如果UITableViewCell不爲零,那麼我可以通過標記查找視圖,但是這會返回一個自動釋放對象。我應該保留它嗎?然後在完成設置值後釋放?或者是這個okey,因爲視圖保留它,所以它至少是1,因此它是安全的不釋放?內存管理問題

有關此類場景的幫助將非常感謝,因此總結一下,何時纔可以在自動釋放對象上進行設置/獲取值?

謝謝你的時間:)

回答

2

你已經在想這個了。

你想讓這個函數獲得一個對象的所有權(並且因此負責它)嗎?不,當然不。所以,不要爲了這個功能而保留。

您是否希望此代碼所在的視圖控制器爲對象負責?否:你想在UIKit的手中留下。所以,不要爲了視圖控制器而保留。

結論:如果你不想取得所有權,你不保留。

此外,不要打擾保留(以及後來發佈)字典。即使它已經被自動釋放到即將消失的程度,這個函數在運行時「很快」不會被執行。

0

是的,沒有必要保留它。您也不需要保留和發佈字典。

2

如果你有一個汽車發佈的對象,你可以操縱它的屬性,將一個參數傳遞給其他方法,甚至將它作爲方法的返回值返回。但是您不能將它存儲在ivar,全局變量或靜態變量中而不保留它。

但是,通過標籤找到的標籤實際上並不是自動釋放的。這只是一個你不擁有的物體。您可以保留並釋放它,但這不是必需的。

的主要情況需要注意的是:

  • 當您獲取從集合對象,然後從集合中刪除對象,收集將其釋放。所以如果你想保留它,你將不得不保留它。
  • 當你正在編寫一個setter方法時,你必須小心處理某人有效執行的情況[object setFoo:object.foo]。如果在保留新的值之前釋放舊值,則可能會發送retain到釋放的對象。