0

我正在尝试获取在他们自己的 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,它符合预期。

4

1 回答 1

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它来访问它。

于 2012-05-07T17:48:02.843 回答