应用程序有时会因错误而崩溃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.delegate
is still unowned(unsafe)
。看来,Apple 正在逐渐将代表更新为weak
.
因此,可以通过检查 Xcode 中的委托声明来简单地确定委托是否已手动设置为 nil。如果是weak
,请不要打扰。