我使用自定义单元格,并调用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时,停止这种废弃内存的正确方法是什么?
发布于 2013-04-19 22:45:36
我怀疑你的漏水可能是从笔尖的插座出来的。请注意loadNibNamed:上的docs中的这句话
要建立插座连接,此方法使用
:forKey:方法,该方法可以使插座中的对象自动保留。
换句话说,由于键值编码的奇怪工作方式,loadNibNamed有时会施加额外的保留。
但是,这只是猜测,没有必要这样做,因为您根本就没有必要调用loadNibNamed:!
你正在使用一个定制的UITableViewCell子类,设计在一个nib中?那为什么不以正常的方式来做呢?创建一个包含一个顶级对象的笔尖:单元格。设计nib中的单元格,设置它的类,连接它的插座等。在您的代码中,在表视图上调用registerNib:forCellReuseIdentifier:,以告知表视图有关您的nib的信息。当您稍后调用dequeueReusableCellWithIdentifier:时,如果重用堆中没有空闲的单元格,表视图将加载您的nib并将单元格交给您。没有混乱,没有大惊小怪。
发布于 2013-12-13 08:30:11
马特的回答恰到好处。下面是代码的样子。修复了我的内存问题,因为单元现在像它应该的那样被加载和出队了。
首先,注册笔尖
[self.tableView registerNib:[UINib nibWithNibName:@"customCell"
bundle:nil]
forCellReuseIdentifier:@"customCellID"];其次..。
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellID"];nib只需要一个表格视图单元格,你就可以开始了!
发布于 2013-04-20 00:50:05
考虑改用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;这种方法应该有助于避免您在使用顶级对象数组时遇到的内存管理问题,并显著提高性能。
https://stackoverflow.com/questions/16106483
复制相似问题