如果对象将要被销毁,为什么我们在dealloc中将委托设置为nil?

use*_*951 9 delegates objective-c ios

-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    PO(NSStringFromCGPoint(self.tableView.contentOffset));
    PO(NSStringFromUIEdgeInsets(self.tableView.contentInset));

    while(false);
}

-(void)dealloc
{
    PO(NSStringFromClass([self class]));
    PO(@"Deallocated");
    self.tableView.delegate=nil;
}
Run Code Online (Sandbox Code Playgroud)

这里我需要设置self.tableView.delegate = nil以避免错误.

从我之前的问题我知道,当委托被销毁时,self.tableView.delegate不会自动变为nill.那是因为委托的类型是赋值引用而不是弱引用.

但是,self.tableView怎么样?

唯一强烈引用self.tableView的是它的自我和自我拥有的超级视图.

所以当self被破坏时,self.tableView也应该被破坏,这意味着self.tableView.delegate也将消失.

那么我为什么需要设置self.tableView.delegate=nil;

小智 9

在许多情况下,您需要将委托设置为nil.在你的情况下,tableView可以被一些外部类引用,并且在你的类dealloc方法之后不会被销毁.并将继续调用其委托方法导致崩溃.有几个类在另一个线程中工作(例如NSURLConnection).即使您释放它,它也可以继续调用委托方法,因为它保留在另一个线程中.


Ant*_* MG 5

如果您持有self.tableView的唯一引用,则无需将委托设置为nil.

唯一需要将委托设置为nil的情况,如果是另一个类将您的类作为委托,因为如果您的类被销毁,那么其他类将查找您的类来实现某些方法,并且您的调用不会在那里.