gpt4 book ai didi

ios - 如果对象无论如何都将被销毁,为什么我们在 dealloc 时将委托(delegate)设置为 nil?

转载 作者:技术小花猫 更新时间:2023-10-29 11:17:57 26 4
gpt4 key购买 nike

-(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;
}

这里我需要设置 self.tableView.delegate = nil 来避免报错。

根据我之前的问题,我知道当委托(delegate)被销毁时,self.tableView.delegate 不会自动变为 null。这是因为委托(delegate)的类型是赋值引用,而不是弱引用。

但是,self.tableView 呢?

唯一对 self.tableView 有强引用的是 self 和 self itsef 拥有的父 View 。

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

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

最佳答案

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

关于ios - 如果对象无论如何都将被销毁,为什么我们在 dealloc 时将委托(delegate)设置为 nil?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20653841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com