应用程序有时会因错误而崩溃objc_object::release()。
苹果开发者技术支持提到了这一点:
请记住,您应该始终执行 _tableView.delegate = nil; 之类的操作。在您的 -dealloc 方法中,即使您使用的是 ARC。出于兼容性原因,系统对象使用
unsafe_unretained引用来实现委托,而不是首选的现代替换weak。
这是否意味着当视图控制器即将被释放时,我必须将系统对象的代表设置为零?
class MyViewController: UIViewController {
deinit {
tableView.delegate = nil
tableView.dataSource = nil
}
}
我总是假设UITableView和类似的标准对象正在使用weak对其代表的引用?
更新:
技术支持的示例似乎已过时,因为UITableView已更新给weak代表。但是,并非所有代表都已更新,例如AVAudioPlayer.delegateis still unowned(unsafe)。看来,Apple 正在逐渐将代表更新为weak.
因此,可以通过检查 Xcode 中的委托声明来简单地确定委托是否已手动设置为 nil。如果是weak,请不要打扰。