(0055)iOS开发之dealloc认识
dealloc:
ARC唯一一个留着 dealloc 方法的原因就是, 你需要释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,停止 Tiner, 等等。
iOS中viewController被POP后不调用dealloc的问题?
ARC下可以重写dealloc方法并在viewController被释放后自动调用,控制器在被pop后移出栈后会被释放,但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是因为当前控制器被某个对象强引用了,控制器的引用计数不为0,系统无法帮你释放这部分内存。原因大致有以下几点:
控制器中NSTimer没有被销毁
当viewController中存在NSTimer时,需要特别注意,当调用[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES]
时,因为 target:self ,也就是引用了当前viewController,导致控制器的引用计数加1,如果没有将这个NSTimer 销毁,它将一直保留该viewController,无法释放,也就不会调用dealloc方法。所以,需要在viewWillDisappear之前需要把控制器用到的NSTimer销毁。
[timer invalidate]; // 销毁timer
timer = nil; // 置nil
viewController中的代理不是weak属性
例如@property (nonatomic, weak) id delegate;代理要使用弱引用,如果代理属性设置为strong,则意味着delegate对视图控制器也进行了强引用,会造成循环引用。导致控制器无法被释放,最终导致内存泄漏。
viewController中block的循环引用
在ARC下,block会把它里面的所有对象强引用,包括当前控制器self,因此有可能会出现循环引用的问题。比如viewController中有个block属性,在block中又强引用了self或者其他成员变量,那么这个viewController与自己的block属性就形成循环引用,导致viewController无法释放。
由于self是__strong修饰,在 ARC 下,当编译器自动将代码中的 block 从栈拷贝到堆时,block 会强引用和持有self,而self恰好也强引用和持有了 block,就造成了传说中的循环引用。
为了避免这种情况发生,可以在变量声明时用weak修饰符修饰变量self,让 block 不强引用self,从而破除循环。
dealloc该写些什么?
在非ARC开发环境中,dealloc是类释放前,清理内存的最后机会。到底那些变量和属性该释放呢,一些特殊的类(nstimer,observer)该怎么释放?
- (void)dealloc
{
// 1. 通知的释放
[[NSNotificationCenter defaultCenter]removeObserver:self];
// 2. delegate的释放
// delegate属性的赋值一般为self,虽然声明时assign,但在相关的view释放时,在之前先释放掉delegate
// 情况一
if (_loadingContentView) {
_loadingContentView.delegate = nil;
[_loadingContentView removeFromSuperview];
}
// 情况二
self.partGridView.uiGridViewDelegate = nil;
self.partGridView = nil;
// 3. 变量的释放
[brandview release];
// 4. 属性的释放
self.labelTitle = nil;
// 5.定时器释放
// 如果实在view中声明初始化的,要在 controller中view释放前先释放定时器,否则由于循环引用,而释放不掉
if (landscape) {
[landscape->timer invalidate];
}
SafeRelease(landscape);
}
iOS ARC环境下dealloc的使用
一般使用ARC的话,dealloc函数是不需要实现的,写了反而会出错。但有些特殊的情况,dealloc函数还是需要的。比如,在画面关闭的时候,需要把ViewController的某些资源释放,在viewDidDissppear不一定合适,这时dealloc里实现:
举个例子,画面上有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下,系统可以帮我们释放该对象,及其包含的对象;但是却无法释放不属于该对象的一些东西,如:由于通知中心是系统的一个单例,你在注册通知的观察者时,实际上是在通知中心注册的,这时,即使ARC下系统帮我们释放了对象,但是在通知中心的观察还是没有移除,那么当有该通知时,依然会尝试调用该对象的接受通知的方法,这可能会导致一些问题.
另外, 在你的 dealloc 方法中, 你仍然可以使用实例变量, 因为他们在这时候还没被释放掉。 在 dealloc 返回之前,都不会被释放。
参考:http://blog.csdn.net/xdrt81y/article/details/10107409
:http://blog.csdn.net/musou_ldns/article/details/7673795
(0055)iOS开发之dealloc认识相关推荐
- iOS开发之ARC(自动引用计数)
iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...
- ios开发之OC基础-类和对象
ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...
- iOS开发之AVKit框架使用
2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...
- (0045) iOS 开发之MBProgressHUD 源码学习
(0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1. 学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...
- (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接
1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...
- 李洪强iOS开发之RunLoop的原理和核心机制
李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...
- IOS开发之MD5加密和钥匙串的使用-oc
IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...
- IOS开发之CALayer基本属性和使用
IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...
- ios开发之plist 的文件的读写以及沙盒容器路径打印
ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...
最新文章
- vuex中获取的数据使用v-model绑定出问题
- 病毒在网络上传播的基本途径分析
- 《剑指offer》-整数中1出现的次数
- java 小于10 自动补零_java 位数自动补0处理
- Oracle无法登陆EM问题解决方案
- 224秒!ImageNet上训练ResNet-50最佳战绩出炉,索尼下血本破纪录
- 做了8年软件测试的我,是如何从菜鸟快速成长为测试工程师的?
- 【回文串3】LeetCode 125. Valid Palindrome
- V4L2驱动的移植与应用(二+三)【转】
- 多线程java_敞开心扉,一起聊聊Java多线程
- 数字电子技术基础(一):进制转换
- 雅黑PHP探针Light,雅黑php探针
- JXLS (Excel 导出工具使用)
- html代码数字上下滚动特效,js实现数字滚动特效
- 方法教程 | Python爬虫:爬取美女图片,看到了意想不到的场景美女图片
- 机器学习之重温线性代数
- 难译 | windbg 乐趣之道(下)
- 南阳理工ACM 题目73 比大小
- 天黑请闭眼服务器维护中,天黑请闭眼!
- 2022年中国互联网数据中心(IDC)行业产业链及市场现状分析(附国家绿色数据中心公示名单)[图]