2013-04-06 59 views
0

如何在函數中返回新分配的對象?如何在Objective-C函數中返回新分配的對象?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"liteCell"]; 
    [cell.textLabel setText:@"Lite"]; 
    return cell; // Object returned to caller as an owning reference (single retain count transferred to caller) 
} 

對象泄露:分配並存儲到「細胞」的對象是從它的名稱的方法返回(「:的cellForRowAtIndexPath:的tableView」)不與「複製」,「mutableCopy」,「的alloc」或'新'。這違反了內存管理指南中的可可

的命名約定規則

回答

1

你應該在這種情況下返回一個自動釋放的對象,因此該解決方案是

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault] autorelease]; 

哦,更好的辦法是使用起來也[tableView dequeueReusableCellWithIdentifier:CellIdentifier] ,像這樣:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (nil == cell) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 

    return cell; 
} 
+1

當然這是假設你不使用ARC。在ARC下,您只需返回該單元格,ARC就會隱含地執行正確的操作。 – 2013-04-06 19:40:09

0

對於需要請檢查是否電池已經被實例化,如果不是你需要實例化細胞的iOS 5:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (nil == cell) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     } 

    return cell; 
} 

下的iOS 6+你只需要註冊你想爲這樣的表格視圖中的單元格:後來

[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier]; 

然後你可以使用:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; 

,並始終接受分配的單元格,所以你只能寫

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
    return cell; 
}