初学者帮助:什么时候打电话给[obj发布]?

时间:2009-10-31 02:54:39

标签: iphone memory-management

我正在编写我的第一个iPhone应用程序(因EXC BAD ACCESS错误而崩溃)。

我已经阅读了其他一些类似的答案,但仍然没有清楚了解如何修复我的代码。

有人可以帮助修复此代码段中UITableViewCell *单元格对象的内存管理:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:kCityCellReuseID];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCityCellReuseID];
        cell.selectionStyle = UITableViewCellSelectionStyleBlue;
        cell.textLabel.text = [[self.myData objectAtIndex:indexPath.section] valueForKey:kDisplayText];
        [cell release];
    }
    return cell;
}

2 个答案:

答案 0 :(得分:4)

您必须致电[cell autorelease]而不是[cell release]。当你在那里释放单元格时,它会在你将它返回到表格视图之前立即被释放,并且表格视图可以取得它的所有权(即保留它)。

如果您自动释放单元格,则表示您放弃了对象的所有权(这是正确的事情,因为您使用alloc创建了它),但在自动释放之前它不会被释放游泳池到达它。到那时,表视图将保留单元格。

如果你没有自动释放单元格(即如果你删除了释放行),程序就不会崩溃,但每次创建新单元格时都会泄漏内存。

答案 1 :(得分:0)

您的应用程序崩溃,因为您正在返回已在函数内释放的对象。您可以代替在函数中释放它,将所有权传递给函数的调用者。然后是调用者在完成对象时释放对象。