很奇怪!=零检查问题

时间:2011-01-07 14:34:55

标签: objective-c uitableview memory-management uiview

我有一个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变量,我能读到的所有内容都表明它是正确的方法。

3 个答案:

答案 0 :(得分:3)

作为兴趣点;向nil对象发送消息不是错误;你的大量支票都是无用的。

如果没有更多信息,很难指出这里究竟发生了什么;如果dataFailedToLoad 实际是唯一分配errorView的地方,那么您的代码应该可行。然而,它的失败表明其他东西正在搞砸你的狗。

顺便提一句,一个空指针,即!= nil不是空指针。

答案 1 :(得分:1)

仅仅因为您调用init,视图不必初始化。您应该使用标准方法viewDidLoad来确保视图不是nil。

答案 2 :(得分:0)

您确定要与您认为正在谈话的实例交谈吗?

我已经看到了很多SO问题,这些问题已经归结为界面文件(xib)实例化的加载和开发人员需要实例化的内容之间的混淆。

即。在所有方法中执行NSLog(@"%@ %p", self, self);之类的操作,并确保地址 - 实例 - 是相同的。