0

我正在使用自定义单元格并调用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 时停止这种废弃内存的正确方法是什么?

4

3 回答 3

1

马特的回答很到位。这是代码的样子。立即修复了我的内存问题,因为单元格现在已按应有的方式加载和出列。

首先,注册笔尖

[self.tableView registerNib:[UINib nibWithNibName:@"customCell"
                                           bundle:nil] 
                           forCellReuseIdentifier:@"customCellID"];

第二...

CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellID"];

笔尖只需要一个 tableviewcell 就可以了!

于 2013-12-13T00:30:11.360 回答
1

我怀疑你的泄漏可能来自笔尖的出口。请注意以下文档中的这句话loadNibNamed:

建立outlet连接,该方法使用setValue:forKey:方法,可能会导致outlet中的对象被自动保留。

换句话说,loadNibNamed有时由于键值编码工作方式的奇怪而强加了额外的保留。

不过,那是猜测,没必要,因为你一开始就不需要打电话loadNibNamed:

您正在使用在笔尖中设计的自定义 UITableViewCell 子类?那为什么不按正常方式做呢?制作一个包含一个顶级对象的笔尖:单元格。设计笔尖中的单元格,设置其类,连接其插座等。在您的代码中,调用registerNib:forCellReuseIdentifier:表格视图,以告诉表格视图您的笔尖。当您稍后调用时dequeueReusableCellWithIdentifier:,如果重用堆中没有空闲单元格,表格视图将加载您的 nib 并将单元格交给您。没有混乱,没有大惊小怪。

于 2013-04-19T14:45:35.733 回答
0

考虑UINib改用。UINib 将 nib 文件的内容缓存在内存中,从而节省了对文件系统的访问。例如,您可以创建一个 nib 实例并在属性中引用:

self.cellNib = [UINib nibWithNibName:@"customCell" bundle:nil];

在 nib 文件中,将单元格绑定到表格视图控制器的属性。然后,每当您需要单元格的实例时,请该UINib实例为您实例化它,对新单元格的引用将自动存储在属性中。

[self.cellNib instantiateWithOwner:self options:nil];
cell = self.customCell;
self.customCell = nil;

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

于 2013-04-19T16:50:04.940 回答