iOS UIViewController,为什么“self”成为viewDidUnload中的“wild pointer”?

时间:2013-09-11 03:36:44

标签: ios uitableview pointers viewdidunload

我的代码段:

- (void)viewDidUnload{
    [super viewDidUnload];
    self.statusView = nil;
    self.tableView = nil;
    self.noDataView = nil;
}

在极少数情况下,我的应用程序在self.noDataView = nil;行崩溃了。当我通过po self调试时,它似乎指向了除当前控制器之外的其他东西。可能的原因是什么?

PS:self.tableView的{​​{1}}和delegatedataSource方法中设置为self。这与此有什么关系吗?

2 个答案:

答案 0 :(得分:1)

首先,[super viewDidUnload]应该用作最后一个语句。但是,这可能无法解决您的错误。

问题的原因很简单。你的控制器在某个地方被过度释放。你有僵尸检测功能吗?应用程序崩溃的代码通常无关紧要,因为问题发生得更早。

答案 1 :(得分:0)

viewWillUnload现已弃用,你不能指望它,任何有关它的问题都会引导你进入下面的参考文献。

来自Apple:

  

在iOS 6中,viewWillUnload和viewDidUnload方法   UIViewController现已弃用。如果您使用这些方法   要发布数据,请改用didReceiveMemoryWarning方法。您   也可以使用此方法释放对视图的引用   控制器的视图是否未被使用。你需要测试一下   在执行此操作之前,视图不在窗口中。

引用WWDC 2012:

  

方法viewWillUnload和viewDidUnload。我们不会打电话   他们了。我的意思是,有一种成本效益方程式   我们经历过的分析。在早期,有一个真实的   性能需要我们确保在内存警告中我们卸载   观点。有各种图形和后备存储等等   那也会卸载。我们现在卸载那些独立的   看来,对于那些被卸载的人来说,这对我们来说并不是什么大不了的事,   并且有很多错误会有指针进入。

修改: 对于iOS 5.1中的问题,viewDidUnload用于释放创建视图时所做的任何操作,因此,除非您在viewDidLoadnib中创建或保留对象,否则可能不会在viewDidUnload中发布它们。