An app crashes sometimes with error objc_object::release()
.
The Apple Developer Technical Support mentioned this:
Remember that you should always do something like _tableView.delegate = nil; in your -dealloc methods, even if you are using ARC. For compatibility reasons system objects use
unsafe_unretained
references to implement delegation, instead of the preferred modern replacementweak
.
Does that mean that I have to set the delegates of system objects to nil when the view controller is about to be released?
class MyViewController: UIViewController {
deinit {
tableView.delegate = nil
tableView.dataSource = nil
}
}
I always assumed UITableView
and similar standard objects are using weak
references to their delegates?
Update:
It seems that the example by the Technical Support was outdated as UITableView
has already been updated to a weak
delegate. However not all delegates have been updated, e.g. the AVAudioPlayer.delegate
is still unowned(unsafe)
. It seems that Apple is gradually updating delegates to be weak
.
So as to whether a delegate has been set to nil manually can simply be determined by inspecting the delegate declaration in Xcode. If it is weak
, don't bother.