Iphone 使用UINib/指针时出现奇怪的问题

Iphone 使用UINib/指针时出现奇怪的问题,iphone,objective-c,pointers,nib,Iphone,Objective C,Pointers,Nib,我在使用UINib时遇到了一些奇怪的事情,尽管我怀疑真正的问题可能隐藏在其他地方 我的应用程序使用的是tableview,由于其复杂性,单元格的内容已在Interface Builder中准备好。对于新的单元(与重用的单元相反),nib的内容使用。因为所有单元格只使用一个nib,并且为了减少每次加载文件的开销,我将UINib作为属性cellNib添加到我的viewcontroller子类中,我在viewDidLoad的实现中加载了该子类一次 现在是奇怪的部分。一切正常,tableview中填充了

我在使用UINib时遇到了一些奇怪的事情,尽管我怀疑真正的问题可能隐藏在其他地方

我的应用程序使用的是tableview,由于其复杂性,单元格的内容已在Interface Builder中准备好。对于新的单元(与重用的单元相反),nib的内容使用。因为所有单元格只使用一个nib,并且为了减少每次加载文件的开销,我将UINib作为属性
cellNib
添加到我的viewcontroller子类中,我在viewDidLoad的实现中加载了该子类一次

现在是奇怪的部分。一切正常,tableview中填充了数据,所有单元格都设置了nib的内容。但只要我滚动tableview,应用程序就会崩溃。
调用堆栈泄露了这一信息:-[NSCFNumber instantiateWithOwner:options:::未识别的选择器发送到实例 显然,再次实例化cellNib内容的消息发送到了错误的对象。消息发送到的对象时而不同,因此存在一些随机现象

我不明白-为什么它在加载tableview时工作了大约10次,而在滚动tableview时却不再工作了

如果我每次都创建一个UINib的新实例(如下面的代码所示),那么包括滚动在内的一切都正常工作

我在哪里犯错误?我的UINib属性的指针是否正在逃逸?如果是,为什么

以下是我正在使用的代码(我删除了所有数据加载和其他内容,以使其更易于阅读):


非常感谢

此行将
自动释放
d实例分配给
cellNib

cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];
这意味着使用以下行:

NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];
cellNib
在其关联的自动释放池耗尽时已解除分配,使用它将导致未定义的行为

如果您想
cellNib
留下来,请获得它的所有权,例如使用声明的属性:

self.cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];

你完全正确。它正在工作。你能解释一下为什么cellNib=和self.cellNib=之间有区别吗?我总是在通过self引用属性的对象的上下文中思考。是“可选的”。。。(愚蠢的我)@Toastor:这两种变体做完全不同的事情
self.cellNib=…
是调用setter的“点语法”,在您的例子中,setter保留该语法
cellNib=…
直接分配给ivar,覆盖上一个指针值。有关详细信息,请参阅苹果文档中的。
NSArray *nibArray = [cellNib instantiateWithOwner:self options:nil];
self.cellNib = [UINib nibWithNibName:@"NTDCell" bundle:nil];