iOS开发:我在这段代码中如何管理内存不当?

时间:2010-12-03 16:26:27

标签: ios objective-c iphone ipad memory-management

我刚刚添加了一些代码来自Apple docs,它展示了如何使用从笔尖创建的自定义UITableViewCells。我是iOS开发的新手,所以我还在学习正确的内存管理,而且代码对于我的工作原理并不是很清楚。当我运行Allocations工具时,它会在下面的代码中显示未分配的内存。具体来说,它显示UITableViewCells在视图控制器弹出导航堆栈后保持活动状态...

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    static NSString *CellIdentifier = @"MyCustomCellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil];  //<--Allocations instrument complaining about this line
        cell = customCell;
        [self setCustomCell:nil];
    }

    return cell;
}

customCell是在此视图控制器中定义的实例var,如此...

IBOutlet UITableViewCell *customCell;
@property (nonatomic, retain) IBOutlet UITableViewCell *customCell;

此代码中是否存在问题?

非常感谢你的智慧!

3 个答案:

答案 0 :(得分:2)

我比较了文档中的代码:

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"TVCell" owner:self options:nil];
    cell = tvCell;
    self.tvCell = nil;
}

使用您的代码:

if (cell == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"MyCustomCell_iPhone" owner:self options:nil];
    cell = [self customCell];
    [self setCustomCell:nil];
}

您指定cell的行似乎存在差异。 Apple的示例代码使用tvCell实例变量,而您使用[self customCell],实例变量的属性getter 。这可能是原因吗?尝试更改

    cell = [self customCell];

    cell = customCell;

答案 1 :(得分:1)

就内存而言,你的代码对我来说很好。

我认为发生的是您的视图控制器未被释放。在ObjectAlloc中,您看到表单元格仍然被保留,因为它们依次由表视图保持,而视图控制器又由视图控制器保存...

最常见的原因是忘记在dealloc中设置任何使用视图控制器作为nil委托的内容。

或者可能,但更不可能,您没有发布表格视图。在ObjectAlloc中,离开视图控制器后,我会检查视图控制器本身是否也在内存中。

答案 2 :(得分:0)

使用调试器。在dealloc中设置一个断点。弹出导航控制器时是否被调用?