Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios topLevelObjects的loadNibNamed泄漏_Ios_Objective C_Uitableview_Automatic Ref Counting_Loadnibnamed - Fatal编程技术网

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为目标。@Helium3
self
将是表视图控制器,并且将由您向控制器类添加属性以绑定到nib文件中的单元格。