表单元格内存泄漏的UICachedDeviceWhiteColor和NSAutoRelease

时间:2009-03-05 15:49:30

标签: objective-c iphone cocoa-touch uitableview

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

2 个答案:

答案 0 :(得分:1)

由于你的属性声明,你的cellName属性的sythesized setter将保留传递给它的对象。

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

此外,每次请求cellView时都不需要加载nib。检查cellName!= nil是否返回并返回它或在cellView上设置reuseIdentifier,以便dequeueReusableCellWithIdentifier可以找到它。

答案 1 :(得分: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,则无法在代码中执行此操作。
  • 始终确保电池已自动释放。可以手动执行,也可以确保使用返回自动释放内存的cocoa函数(如objectAtIndex:方法那样)。