Ios topLevelObjects的loadNibNamed泄漏
我正在使用自定义单元格,我调用Ios topLevelObjects的loadNibNamed泄漏,ios,objective-c,uitableview,automatic-ref-counting,loadnibnamed,Ios,Objective C,Uitableview,Automatic Ref Counting,Loadnibnamed,我正在使用自定义单元格,我调用loadNibNamed:。这似乎会导致内存泄漏,我不知道如何解决它。如果之后我将顶层对象设置为nil,我仍然会得到泄漏 topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"customCell" owner:self options:nil]; 然后我做这个 for (id currentObject in topLevelObjects){ if ([currentObject isK
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时,如何正确地停止这个废弃的内存?我怀疑您的泄漏可能来自nib中的插座。注意
loadNibNamed:
上的短语:
要建立出口连接,此方法使用setValue:forKey:method,这可能会导致自动保留出口中的对象
换句话说,loadNibNamed
由于键值编码的工作方式很奇怪,因此有时会施加额外的保留
然而,这只是猜测,没有必要这样做,因为您首先不需要调用loadNibNamed:
您正在使用在nib中设计的自定义UITableViewCell子类?那为什么不按正常的方式做呢?制作一个包含一个顶级对象的笔尖:单元格。在nib中设计单元,设置其类,连接其出口等。在代码中,在表视图上调用registerNib:forCellReuseIdentifier:,告诉表视图有关nib的信息。当您稍后调用
dequeueReusableCellWithIdentifier:
时,如果重用堆中没有空闲单元格,表视图将加载nib并将单元格交给您。没有混乱,没有麻烦。考虑改用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;
这种方法有助于避免您在使用顶级对象阵列时遇到的内存管理问题,并显著提高性能。马特的答案是正确的。下面是代码的样子。立即修复了我的内存问题,因为单元格现在已按原样加载和退出队列 首先,注册nib
[self.tableView registerNib:[UINib nibWithNibName:@"customCell"
bundle:nil]
forCellReuseIdentifier:@"customCellID"];
其次
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCellID"];
笔尖中只需要一个tableviewcell,您就可以开始了 仪器是否报告泄漏?您是在设备上运行时泄漏,还是仅在模拟器中泄漏?你在处理数组中的对象吗?有我的问题吗?谢谢。是的,它在设备上,在仪器中,我迭代toplevelobjects以获得单元格,这样我就可以改变它的属性。谢谢。我在调试器中看到了一个单元格,但是tableview没有显示任何单元格,但是它似乎可以滚动,滚动位置指示器也会显示,就好像单元格在那里一样,但什么也没有显示。您好@Helium3。您需要一个如何在nib中设计一个单元格以用于表视图的示例吗?这里有一个可下载的完整项目,供您在Xcode中运行和研究:哦,我还应该提到:该代码与我的书中的讨论一致:该部分告诉您设计自定义单元格的所有不同方法。关于如何从nib中获取单元的部分是“在nib中设计单元”小节。谢谢,我将检查链接。我不得不将项目推迟到明天。完成任务后将返回此处。:)谢谢我不确定此场景中的self是什么,以及nib文件中要绑定的tableview属性是什么?这当然适用于iOS 4(替换iOS 3中必须使用的
loadNibNamed
)。但是在iOS 5和iOS 6中,registernb:forCellReuseIdentifier:
是一个不错的选择。@matt+1的确如此,尽管UINib在其他情况下很方便,registernb:forcellreuseidentier:
直接与单元排队机制一起工作,因此如果可用,它更适合。不确定还有多少开发人员需要以iOS 4为目标。@Helium3self
将是表视图控制器,并且将由您向控制器类添加属性以绑定到nib文件中的单元格。