为什么我们设置委托为零dealloc如果对象将被销毁呢?
-(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 =零,以避免错误。
我知道,从我以前的问题,self.tableView.delegate不会自动成为n当委托被销毁。 这是因为委托types是分配引用而不是弱引用。
但是,self.tableView呢?
唯一强烈引用self.tableView的是superview,它拥有self和selfsef。
所以当self被销毁的时候,self.tableView也应该被销毁,这意味着self.tableView.delegate也会被删除。
那么为什么我需要设置self.tableView.delegate=nil
;
如果你持有self.tableView的唯一引用,则不需要将委托设置为nil。
唯一的情况是你必须设置委托为零,如果是另一个类有你的类作为委托,因为如果你的类被销毁,其他类将寻找你的类来实现一些方法,你的电话将不会在那里。
在许多情况下,您需要将委托设置为零。 在你的情况下,tableView可以被一些外部类引用,并不会在你的类dealloc方法之后被销毁。 并会继续调用它的委托方法导致崩溃。 有几个类在另一个线程中工作(例如NSURLConnection)。 即使你释放它,也可以继续调用委托方法,因为它保留在另一个线程中。
比方说,我们有一个SpriteKit scene
,你有一个gesture recognizer
,你设置它的delegate
。
然后你从controller
dealloc
这个scene
和它的recognizer
controller
。
如果delegate
方法在这个过程中被调用,将会导致崩溃 。
其实这不是必需的。 我们正在这样做,以避免形成保留周期。 我们不应该创build一个强有力的参考代表。 如果您不小心创build了具有强引用的委托,那么父级和子级都不会被释放。 在这种情况下,dealloc本身不会被调用。 所以没有必要。