ios:为什么临时加载XIB以获得帧高度会损坏内存?

ios:为什么临时加载XIB以获得帧高度会损坏内存?,ios,memory-management,memory-corruption,loadnibnamed,Ios,Memory Management,Memory Corruption,Loadnibnamed,我正在尝试获取几个UITableCellView的高度,它们在自己的XIB中定义。我创建了一个高度列表,用于UITableViewDelegate的回调heightForRowInPathIndex。当我这样做时,应用程序崩溃,就像内存损坏一样 arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil]; UITableViewCell *cellOfXyz

我正在尝试获取几个UITableCellView的高度,它们在自己的XIB中定义。我创建了一个高度列表,用于UITableViewDelegate的回调heightForRowInPathIndex。当我这样做时,应用程序崩溃,就像内存损坏一样

arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil];

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0];

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz];

[arrayOfTableCellView release];

我已经查看了重新计算,结果与预期一致。

答案很简单,从文档中可以看出:

返回值

包含nib文件中顶级对象的数组。阵列 不包含对文件所有者或任何代理对象的引用; 它只包含nib启动时实例化的对象 文件未归档。您应该保留返回的数组或 它手动包含的对象,以防止nib文件对象 被提前释放

似乎您只是将返回值赋给
ArrayFTableCellView
。如果要保留返回值,并且
ArrayFTableCellView
实际上是viewController上的一个属性,则应使用
self.ArrayFTableCellView
对其进行分配

如果您不保留它,您不必释放它,因为您不拥有它。因此,当您实际获得这样的阵列时

NSArray *arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"TableCellXyz" owner:self options:nil];
那你就不想要了

[arrayOfTableCellView release];
在那里,因为你没有分配对象

编辑:

为了向您证明这一点,我刚刚运行了您的代码,得到了预期的结果:

NSArray * arrayOfTableCellView = [[NSBundle mainBundle] loadNibNamed:@"JLUViewController" owner:self options:nil];

UITableViewCell *cellOfXyz = (UITableViewCell*) [arrayOfTableCellView objectAtIndex:0];

[arrayCellHeights insertObject:[NSNumber numberWithInt:cellOfAlerts.frame.size.height] atIndex:kIndexXyz];
上述代码不会崩溃或导致泄漏。仪器没有泄漏,所以你没事

如果你加上

[arrayOfTableCellView release];

尽管它会崩溃,报告EXC_BAD_访问,因为您试图释放一个您不拥有的对象。注意我是如何使NSArray成为局部变量的吗?您也应该这样做,因为您不需要将其作为属性,因为您只需要在函数的范围内使用它。另外,请注意,如果
arrayCellHeights
是viewcontroller中的一个属性,请始终使用
self.arrayCellHeights
访问它。

请注意:您不应信任重新计数。你不知道幕后发生了什么。你会犯什么样的错误?我猜这是EXC_BAD_ACCESS?顺便说一句-错误是从应用程序跳出的。在我的插装过程中,我的经验是,其中大多数都是内存保留/释放不一致。在某些情况下,zombies.OK-让我再做一些测试。但当我最初没有“保留”时,仪器宣布泄漏。如果我将数组的retain count设置为“NSLog”,则它将设置为1,我假设它来自于指定的loadnibName。话虽如此,您在问题中的上述评论指出,我不能相信该值,因为它在幕后是一个神奇的值。@mobibob:这让您有了收获吗?我的崩溃是应用程序内存占用的iOS4问题的副作用。显然,与iOS4相比,iOS5为初始启动(x4或x10)分配了更多内存。我一减小应用程序的初始大小,问题就消失了——有一段时间。它后来因为同样的原因崩溃了,但在iOS5上永远运行。试着说服管理层:)