ARC情况下dealloc重写的作用

众所周知,iOS开发的时候,使用ARC的话,dealloc函数是不需要实现的,写了反而会出错。
有些特殊的情况,dealloc函数还是需要的。比如,在画面关闭的时候,需要把ViewController的某些资源释放,在viewDidDissppear不一定合适,viewDidUnload一般情况下只在memory warning的时候才被调用。
MRC的情况下,我们自然会想到dealloc函数。

使用情况

其实ARC环境下,也没有把dealloc函数禁掉,还是可以使用的。但不用手动调用[supper dealloc]了,因为系统在此方法返回的时候自动执行[supper dealloc]。
在dealloc重写方法中,你可以释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,注销观察者,停止 Timer 等。

例子

画面上有UIWebView,它的delegate是该画面的ViewController,在WebView载入完成后,需要做某些事情,比如,把indicator停掉之类的。
如果在WebView载入完成之前关闭画面的话,画面关闭后,ViewController也释放了。但由于WebView正在载入页面,而不会马上被释放,等到页面载入完毕后,回调delegate(ViewController)中的方法,由于此时ViewController已经被释放,所以会出错:message sent to deallocated instance

解决方案

解决办法是在dealloc中把WebView的delegate释放。

-(void)dealloc 
{
    self.webView.delegate = nil;
}

总结

ARC 下, 不用手动调用[supper dealloc]了,因为系统在此方法返回的时候自动执行[supper dealloc]。在dealloc重写方法中,你可以释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,注销观察者, 请求取消等。

延伸阅读 #重要#:
ARC下dealloc过程及.cxx_destruct的探究

相关阅读:
ARC下的注意事项

你可能感兴趣的:(ARC情况下dealloc重写的作用)