如何解决在UIViewController已经离开时调用viewDidScroll的bug?

我经常受到伤害 很稀less。 但有时候会发生。

我尝试僵尸生成,我得到这个:

*** -[BGDetailBusinessViewController scrollViewDidScroll:]: message sent to deallocated instance 0x189f09c0 

我想这是由于以下原因

滚动时popupBGDetailBusinessViewController。

视图仍在滚动。

它发送通知某处称它为委托,即BGDetailBusinessViewController对象。 因为对委托的引用是弱的,我想这是什么原因导致的问题。

现在,我该如何解决这个问题?

弱引用工作的方式是如果对象被释放,它将是正确的?

也许这不是由于僵尸造成的。 但是,这意味着如果使用僵尸构build构build,这个错误将会显示出来。

如果一个对象变成僵尸,那么所有对这个对象的弱引用都会被删除?

无论如何,我想知道如何解决这个错误,因为我设法find了它。

有人说,我应该设置委托在零dealloc。

如果我们启用僵尸对象,是否所有弱引用都被删除? 否则build议。 当一个对象被释放时,所有的弱引用,这样的委托应该被删除。

其实我真的想不出有什么原因,僵尸与否,访问释放的对象可以发生在所有。 如果引用强,那么对象不会被释放。 如果引用是弱的,那么当对象被释放时它就被抛弃了。

然而,应用程序确实崩溃了:错误消息发送到解除分配的实例0x189f09c0

您必须使用dealloc方法将委托设置为nil

 scrollView.delegate = nil; 

解除分配的对象被释放(并从内存中移除),但未设置为零。 你必须明确地将其设置为零。

你试图取消订阅scrollView的“通知”?

 - (void)dealloc { self.scrollView.delegate = nil; // or tableView, collectionView, etc. }