loadNibNamed leak of topLevelObjects



我使用自定义单元格,我调用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;

这种方法应该有助于避免使用顶级对象数组时遇到的内存管理问题,并且还可以显著提高性能。

相关内容

  • 没有找到相关文章

最新更新