是否需要将系统对象代表设置为零



有时会出现错误 objc_object::release()

崩溃

Apple开发人员的技术支持提到了这一点:

请记住,您应该始终做类似_tableView.delegate之类的事情 = nil;即使您正在使用弧线,在您的-dealloc方法中也是如此。出于兼容原因,系统对象使用unsafe_unretained 引用实施代表团,而不是首选的现代 替换weak

这是否意味着我必须在即将发布视图控制器时将系统对象的代表设置为零?

class MyViewController: UIViewController {
   deinit {
      tableView.delegate = nil
      tableView.dataSource = nil
   }
}

我一直假定UITableView,类似的标准对象正在使用weak引用其代表?


更新:

看来,由于UITableView已经更新为weak委托,因此技术支持的示例已经过时了。但是,并非所有代表都已更新,例如AVAudioPlayer.delegate仍然是unowned(unsafe)。似乎苹果正在逐渐更新代表为weak

是否可以通过检查Xcode中的代表声明来简单地确定是否将代表设置为无用。如果是weak,请不要打扰。

是的,您应该将这些代表设置为nil

名称所建议的,unsafe_unretained参考不会保留您的视图控制器,因此这里没有保留周期或内存泄漏。但是,与weak不同,当您的视图控制器被划分时,这些引用将不会自动设置为nil。在大多数情况下,这不是问题,因为您的视图控制器会超过其观点,或者至少同时被划分。不幸的是,在某些情况下,Uikit可能也暂时保留了这一观点。这可以允许视图超过视图控制器,并试图在交易的对象上调用委派方法,从而导致崩溃。

我知道的最简单的方法是在行动中看到这一点,即在滚动仍在滚动时,将视图控制器解散和审理一个视图控制器(或者是uitableview之类的一个子类)(或其一个子类)(例如Uaithitview)(例如在一长串物品上滑动手势)。然后,滚动视图将尝试在交易列出的控制器上调用委托方法(例如scrollViewDidScroll)。

最新更新