0

我直接在 dealloc 中清除表视图委托和数据源方法,如下所示:

 - (void)dealloc
{
  self.tableView.delegate = nil;
  self.tableView.dataSource = nil;
}

但是看一些网上dealloc的例子,我发现每个人都在检查视图是否被加载,然后清除委托和数据源,如下所示:

- (void)dealloc
{   
    if ([self isViewLoaded])
    {
        self.tableView.delegate = nil;
        self.tableView.dataSource = nil;
    }
}

想知道是否只是检查内存是否分配给视图,如果是则清除否则不。或者有什么特别的原因要在这里添加支票?

4

2 回答 2

2

如果您的控制器是表视图控制器,则self.tableView在未加载视图时调用将导致它加载。如果您即将被释放,那么加载视图就没有意义了。因此,检查isViewLoaded是防止这种情况发生的一种廉价方法。

于 2013-10-10T20:59:12.510 回答
0

@Wain 提到的是正确的。但是,根据iOS 内存管理指南,您永远不应该使用它self来引用内部的 ivar,init或者dealloc精确地用于他所描述的情况。

正确的做法是:

- (void)dealloc
{
    _tableView.delegate = nil;
    _tableView.dataSource = nil;
} 

希望这可以帮助!

于 2013-10-10T21:05:05.563 回答