我有一个UITableViewController,它有一个名为errorView的UIView *,用于在方法无法加载网页数据时在表视图上覆盖错误信息。
在init方法中,errorView设置为nil(调试器中为0x0)。
在一个加载方法中,在init结束时调用并且如果点击'refresh'UIButton(在errorView上),则将errorView与nil进行比较,并从superview中删除并释放,如果它不是nil(仍然显示为0x0)在调试器中。)
在dealloc方法中,在释放之前完成相同的检查;但由于某种原因,即使尚未分配变量(调试器中为0xc000),变量也永远不会为零,因为从未调用过数据失败的方法。然后应用程序崩溃,因为它试图释放一个空指针,即!= nil。
示例:
-(id)init {
errorView = nil;
[self Load];
}
-(void)Load {
if(errorView != nil) {
[errorView removeFromSuperView];
[errorView release];
errorView = nil;
}
//Attempt to load data from web
}
-(void)dataFailedToLoad (e.g. UIWebView didFailLoadWithError) {
errorView = [[UIView alloc] initWithFrame, etc];
[self.tableView addSubview:errorView];
}
-(void)dealloc {
if(errorView != nil)
[errorView release]; //Always crashes because errorView is never nil even though it has been assigned nil?
}
我正在把头发拉出来。除了所描述的这些方法之外,其他任何地方都没有使用errorView变量,我能读到的所有内容都表明它是正确的方法。
答案 0 :(得分:3)
作为兴趣点;向nil对象发送消息不是错误;你的大量支票都是无用的。
如果没有更多信息,很难指出这里究竟发生了什么;如果dataFailedToLoad 实际是唯一分配errorView的地方,那么您的代码应该可行。然而,它的失败表明其他东西正在搞砸你的狗。
顺便提一句,一个空指针,即!= nil不是空指针。
答案 1 :(得分:1)
仅仅因为您调用init
,视图不必初始化。您应该使用标准方法viewDidLoad
来确保视图不是nil。
答案 2 :(得分:0)
您确定要与您认为正在谈话的实例交谈吗?
我已经看到了很多SO问题,这些问题已经归结为界面文件(xib)实例化的加载和开发人员需要实例化的内容之间的混淆。
即。在所有方法中执行NSLog(@"%@ %p", self, self);
之类的操作,并确保地址 - 实例 - 是相同的。