【问题标题】:iOS Development: How am I mismanaging memory in this code?iOS 开发:我如何在这段代码中管理不善?
【发布时间】:2011-05-19 20:32:48
【问题描述】:

我刚刚添加了一些取自 Apple docs 的代码,它显示了如何使用从 nib 创建的自定义 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 是这个视图控制器中定义的一个实例变量,像这样...

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

这段代码有问题吗?

非常感谢您的智慧!

【问题讨论】:

  • 希望你也定义了一个名为 customCell 的@property?
  • 自定义 Cell 是否需要成为 IBOutlet?如果您只是想加载自定义销售,则不需要将其作为出口。
  • DerekH,它需要是一个插座,这样他就可以在加载笔尖时连接电池上的手柄。
  • 澄清一下,问题是你泄露了这些单元格? “未分配”是什么意思?
  • @Firoze,在 Allocations 工具中,它显示我的每个 UITableViewCells 在表格视图控制器从导航堆栈中弹出后仍然保持活动状态,这意味着我的内存使用量每次都会增长这么多内存视图控制器已加载。它在上面标记的代码行旁边显示 95%。我假设这意味着 95% 的问题源于那行代码?

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


【解决方案1】:

我比较了文档中的代码:

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]实例变量的属性获取器。这可能是原因吗?尝试改变

    cell = [self customCell];

    cell = customCell;

【讨论】:

  • 谢谢,bolt,我试过了,但似乎没有任何区别。在从导航堆栈中弹出视图控制器后,Allocations 工具仍在报告 UITableViewCells 仍然存在。
  • 感谢您了解这一点。它似乎没有帮助,但它可能会影响其他地方的事情。问题是持有单元格的 UITableView 没有被正确释放。再次感谢您的帮助
  • @BeachRunnerJoe:没问题,很高兴你最终找到了它。
【解决方案2】:

就内存而言,您的代码对我来说看起来不错。

我认为正在发生的是您的视图控制器没有被释放。在 ObjectAlloc 中,您会看到表格单元格仍被保留,因为它们反过来由您的表格视图持有,而后者又由您的视图控制器持有...

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多