2013-10-10 23 views
0

我直接的dealloc如下清除出表視圖委託和數據源的方法:結算表視圖代表和在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; 
    } 
} 

好奇,想知道它只是檢查,如果內存分配給視圖,如果是那麼清楚別的不行。或者在這裏添加支票有什麼特別的原因嗎?

回答

2

如果您的控制器是一個表視圖控制器,那麼當視圖未加載時調用self.tableView將導致它加載。如果您即將被釋放,那麼加載視圖的工作就沒有意義了。因此檢查isViewLoaded是防止這種情況發生的廉價方法。

0

@Wain提到的是正確的。然而,根據iOS Memory Management Guidelines你應該 永遠不要使用self來指內部initdealloc內的伊娃,正是爲了他所描述的情況。

做正確的方式,它是:

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

希望這有助於!