0

我有一个显示 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;
4

2 回答 2

1

实际上,如果您将 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: 方法所做的那样)。
于 2009-03-05T21:05:44.383 回答
1

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

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

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

于 2009-03-05T16:23:18.713 回答