【问题标题】:UICachedDeviceWhiteColor and NSAutoRelease for table cell mem leaksUICachedDeviceWhiteColor 和 NSAutoRelease 用于表单元格内存泄漏
【发布时间】:2009-03-05 15:49:29
【问题描述】:

我有一个显示 UICachedDeviceWhiteColor 的内存泄漏。我没有在任何地方使用 UICachedDeviceWhiteColor 并且搜索它发现人们说这是 iPhone-SDK 中的错误。我发现了这个博客条目: http://piezoelectrics.blogspot.com/2009/02/uicacheddevicewhitecolor-leak-in-iphone.html

但我找不到

#import "NSAutoreleasePool.h"  

我收到“错误:NSAutoReleasePool.h:没有这样的文件或目录”。是否有解决此内存泄漏或从 nib 分配表格单元格的正确方法?

这是我目前的做法:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {   

UITableViewCell *cell = nil;    
cell = [tableView dequeueReusableCellWithIdentifier:@"CellNameIdentifier"];

if (cell == nil) {
[[NSBundle mainBundle] loadNibNamed:@"CellName" owner:self options:nil];
//cellName is IBOutlet to XIB's tablecell.  I reference it several times in this calss
cell = cellName; 
}

return cell;

}

我在这里没有看到分配器,为什么会有内存泄漏?这可能是个问题吗:

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

【问题讨论】:

    标签: objective-c iphone cocoa-touch uitableview


    【解决方案1】:

    由于您的属性声明,您的 cellName 属性的合成设置器将保留传递给它的对象。

    您应该在您的 dealloc 方法中向 cellName 发送一条释放消息。

    此外,每次请求 cellView 时都无需加载 nib。要么检查 cellName != nil 并返回它,要么在 cellView 上设置重用标识符,以便 dequeueReusableCellWithIdentifier 可以找到它。

    【讨论】:

      【解决方案2】:

      实际上,如果您将 NIB 用于您的表格视图单元格(通常不需要,除非您正在做一些真正自定义的事情),您每次在可重用的表格视图上没有受到影响时都必须加载它细胞。我觉得下面的代码看起来更干净一些:

      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyID"];
      if (cell == nil) {
          NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CellName"
                          owner:self options:nil];
          cell = [nib objectAtIndex:1];
      }
      

      如果单元格是 NIB 中的第一个对象(零对象是文件所有者),则 objectAtIndex:1 技巧起作用。

      做表格视图单元格的一些注意事项:

      • 不要通过指定属性或手动方式隐式保留单元格对象。这将使可重用表格单元格功能无法正常工作,因为它无法释放单元格内存。
      • 不要忘记在界面生成器中设置单元重用标识符,因为如果您使用的是 NIB,则无法在代码中执行此操作。
      • 始终确保单元是自动释放的。要么手动执行,要么确保您使用可返回自动释放内存的可可函数(就像 objectAtIndex: 方法一样)。

      【讨论】:

      • 对于#1,属性属性是否只包含“非原子”?对于 #3,自动释放的单元格在哪里...dealloc - 但这不是您的意思吗?
      • 我无法在评论中详细说明(太短)。听起来您需要阅读 Objective-C 内存管理论文。确保牢牢掌握引用计数以及保留、释放和解除分配。还有一个关于自动释放的部分。如果我能提供帮助,请发送邮件至 jonthomason@me.com。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 1970-01-01
      • 2015-11-03
      • 2018-02-23
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多