我使用自定义单元格,我调用loadNibNamed:
。这似乎会导致内存泄漏,我不确定如何解决它。如果我将顶级对象设置为nil
之后,我仍然得到泄漏。
topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil];
我然后做这个
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]){
cell = (CustomCell *) currentObject;
break;
}
}
,然后改变单元格的属性。
自定义单元格对属性有很强的引用,它不是一个循环引用,所以我不确定这是否是问题。什么是正确的方法来停止这种废弃的内存时,使用ARC?
我怀疑您的泄漏可能来自笔尖的出口。请注意loadNibNamed:
文档中的这个短语:
要建立出口连接,该方法使用setValue:forKey:方法,该方法可能导致自动保留出口中的对象。
换句话说,loadNibNamed
有时会因为键值编码的奇怪方式而施加额外的保留。
然而,这是猜测,没有必要,因为你不需要调用loadNibNamed:
放在首位!
你正在使用自定义UITableViewCell子类,在nib中设计?那为什么不按正常的方式来呢?创建一个包含一个顶层对象的笔尖:cell。在笔尖中设计单元格,设置它的类,连接它的出口等等。在你的代码中,调用表视图上的registerNib:forCellReuseIdentifier:
,告诉表视图你的笔尖。当您稍后调用dequeueReusableCellWithIdentifier:
时,如果重用堆中没有空闲单元格,表视图将加载您的nib并将单元格交给您。不乱不闹
Matt的回答完全正确。下面是代码的样子。修复了我的内存问题,因为单元格现在被加载和排队,因为它应该是。
首先,注册笔尖[self.tableView registerNib:[UINib nibWithNibName:@"customCell"
bundle:nil]
forCellReuseIdentifier:@"customCellID"];
其次……
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellID"];
nib只需要一个tableviewcell就可以了!
考虑使用UINib
。UINib将nib文件的内容缓存到内存中,从而节省了对文件系统的访问。例如,你可以在属性中创建nib和reference的实例:
self.cellNib = [UINib nibWithNibName:@"customCell" bundle:nil];
在nib文件中,将单元格绑定到表视图控制器的属性。然后,当您需要单元格的实例时,请要求UINib
实例为您实例化它,并且对新单元格的引用将自动存储在属性中。
[self.cellNib instantiateWithOwner:self options:nil];
cell = self.customCell;
self.customCell = nil;
这种方法应该有助于避免使用顶级对象数组时遇到的内存管理问题,并且还可以显著提高性能。