arc环境下dealloc方法中系统会自动做哪些事情
答案:2 悬赏:70 手机版
解决时间 2021-03-04 03:57
- 提问者网友:夢醒日落
- 2021-03-03 14:35
arc环境下dealloc方法中系统会自动做哪些事情
最佳答案
- 五星知识达人网友:枭雄戏美人
- 2021-03-03 15:08
Objective-c 语言中最头疼的事就是内存释放,申明一个变量后记得一定要释放这个变量,在我的博客中已经有一些这方面的文章,我们定义的全局变量都是在 - (void)dealloc 函数中释放的;里面继承了一个[super dealloc]方法,有些同学平时自己释放内存都是写在 [super dealloc]的后面,但是在Objective-c 中不能这样写,所有的释放都必须写在 [super dealloc]的前面。-------错误的写法--------- (void)dealloc{ [super dealloc]; [XXX release]; ......}-------正确的写法--------- (void)dealloc{ [XXX release]; [super dealloc]; ......}原因是:“你所创建的每个类都是从父类,根类继承来的,有很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它们不会自动释放内存,你需要调用父类的 dealloc方法来释放,然而在此之前你需要先把自己所写类中的变量内存先释放掉,否则就会造成你本类中的内存积压,造成泄漏”.不过在IOS6有了ARC后就不用手动去释放了,也没有此函数了!
全部回答
- 1楼网友:往事隔山水
- 2021-03-03 16:42
所周知,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;
}
1
2
3
4
1
2
3
4
总结
ARC 下, 不用手动调用[supper dealloc]了,因为系统在此方法返回的时候自动执行[supper dealloc]。在dealloc重写方法中,你可以释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,注销观察者,停止 Timer 等。
有些特殊的情况,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;
}
1
2
3
4
1
2
3
4
总结
ARC 下, 不用手动调用[supper dealloc]了,因为系统在此方法返回的时候自动执行[supper dealloc]。在dealloc重写方法中,你可以释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,注销观察者,停止 Timer 等。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯