我有一个显示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;
答案 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技巧有效。
执行表格视图单元格的一些注意事项: