答案很简单,来自文档:
返回值
包含 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
它来访问它。