【问题标题】:ios: Why is a temporary load of XIB, to get frame height, corrupting memory?ios:为什么临时加载XIB,以获得帧高度,破坏内存?
【发布时间】:2012-05-07 17:38:10
【问题描述】:

我正在尝试获取在它们自己的 XIB 中定义的几个 UITableCellView 的高度。我创建了一个在 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];

我查看了retainCount,它符合预期。

【问题讨论】:

  • 请注意:您不应该信任retainCount。你不知道幕后发生了什么。你得到什么样的错误?我假设它是 EXC_BAD_ACCESS?
  • BTW - 错误跳出应用程序。在我的 Instrumentation 期间,我的经验是,其中大部分结果是内存保留/释放不一致。在某些情况下,僵尸。

标签: ios memory-management memory-corruption loadnibnamed


【解决方案1】:

答案很简单,来自文档:

返回值

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

您似乎只是将返回值分配给arrayOfTableCellView。如果你想保留返回值,而arrayOfTableCellView实际上是你的viewController上的一个属性,那么你应该使用self.arrayOfTableCellView来分配它。

如果你不保留它,你不必释放它,因为你不拥有它。所以当你真正得到这样的数组时

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];

上述代码不会崩溃或导致泄漏。 Instruments 不会报告泄漏,所以你会没事的。

如果你添加

[arrayOfTableCellView release];

虽然它会崩溃,报告 EXC_BAD_ACCESS,因为你试图释放一个你不拥有的对象。请注意我是如何使 NSArray 成为局部变量的?你应该这样做,因为你不需要它是一个属性,因为你只是在函数的范围内使用它。另外请注意,如果 arrayCellHeights 是视图控制器中的属性,请始终使用 self.arrayCellHeights 访问它。

【讨论】:

  • 好的——让我做更多的测试。但是当我最初没有“保留”时,仪器宣布泄漏。如果我“NSLog”数组的保留计数,它设置为 1,我假设它来自 loadNibNamed。话虽如此,您在上面的问题中的评论表明我不能相信这个值,因为它是一个神奇的值,在幕后。
  • @mobibob:这对你有帮助吗?
  • 我的崩溃是 iOS4 应用程序内存占用问题的副作用。显然,与 iOS4 相比,iOS5 为初始启动(x4 或 x10)分配了更多内存。一旦我减小了我的应用程序初始大小,问题就消失了——一会儿。它后来因同样的原因崩溃,但在 iOS5 上永远运行。尝试说服管理层:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多