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对视图控制器也进行了强引用,会造成循环引用。导致控制器无法被释放,最终导致内存泄漏。

viewControllerblock的循环引用

在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认识相关推荐

  1. iOS开发之ARC(自动引用计数)

    iOS开发之ARC(自动引用计数) 英文原文:Automatic Reference Counting on iOS 参与翻译(4人): 纶巾客, showme, 李远超, 王宇龙 自动引用计数(AR ...

  2. ios开发之OC基础-类和对象

    ios开发之OC基础-类和对象 本系列的文章主要来自于个人在学习前锋教育-欧阳坚老师的iOS开发教程之OC语言教学视频所做的笔记,边看视频,边记录课程知识点.建议大家先过一遍视频,在看视频的过程中记录 ...

  3. iOS开发之AVKit框架使用

    2019独角兽企业重金招聘Python工程师标准>>> iOS开发之AVKit框架使用 一.引言 在iOS开发框架中,AVKit是一个非常上层,偏应用的框架,它是基于AVFounda ...

  4. (0045) iOS 开发之MBProgressHUD 源码学习

    (0045) iOS 开发之MBProgressHUD 源码学习 第一部分:学习所得和分析线程 1.  学习到了kvo 的使用 和屏幕方向的旋转判断. 2. 如果调起这个 HUD 的方法不是在主线程调 ...

  5. (0016)iOS 开发之Mac上Navicat Premium 创建远程连接和本地连接

    1.下载安装 (百度云盘里面有安装文件和注册机) 链接: https://pan.baidu.com/s/1kVG1k71 密码: mr5g 破解教程看这篇博客:http://blog.csdn.ne ...

  6. 李洪强iOS开发之RunLoop的原理和核心机制

    李洪强iOS开发之RunLoop的原理和核心机制 搞iOS之后一直没有深入研究过RunLoop,非常的惭愧.刚好前一阵子负责性能优化项目,需要利用RunLoop做性能优化和性能检测,趁着这个机会深入研 ...

  7. IOS开发之MD5加密和钥匙串的使用-oc

    IOS开发之MD5加密和钥匙串的使用-oc 源码在我的主页,md5加密是用户登录安全的一个保障.不可逆的,可以暴力破解的. // // ViewController.m // MD5演练 // // ...

  8. IOS开发之CALayer基本属性和使用

    IOS开发之CALayer基本属性和使用 // // ViewController.m // CALayer // // Created by 鲁军 on 2021/2/21. //#import & ...

  9. ios开发之plist 的文件的读写以及沙盒容器路径打印

    ios开发之plist 的文件的读写以及沙盒容器路径打印 核心代码在这里 // // ViewController.m // 21-plist存储和沙盒路径 // // Created by 鲁军 o ...

最新文章

  1. vuex中获取的数据使用v-model绑定出问题
  2. 病毒在网络上传播的基本途径分析
  3. 《剑指offer》-整数中1出现的次数
  4. java 小于10 自动补零_java 位数自动补0处理
  5. Oracle无法登陆EM问题解决方案
  6. 224秒!ImageNet上训练ResNet-50最佳战绩出炉,索尼下血本破纪录
  7. 做了8年软件测试的我,是如何从菜鸟快速成长为测试工程师的?
  8. 【回文串3】LeetCode 125. Valid Palindrome
  9. V4L2驱动的移植与应用(二+三)【转】
  10. 多线程java_敞开心扉,一起聊聊Java多线程
  11. 数字电子技术基础(一):进制转换
  12. 雅黑PHP探针Light,雅黑php探针
  13. JXLS (Excel 导出工具使用)
  14. html代码数字上下滚动特效,js实现数字滚动特效
  15. 方法教程 | Python爬虫:爬取美女图片,看到了意想不到的场景美女图片
  16. 机器学习之重温线性代数
  17. 难译 | windbg 乐趣之道(下)
  18. 南阳理工ACM 题目73 比大小
  19. 天黑请闭眼服务器维护中,天黑请闭眼!
  20. 2022年中国互联网数据中心(IDC)行业产业链及市场现状分析(附国家绿色数据中心公示名单)[图]

热门文章

  1. macOS配置Apache服务器
  2. Java多线程干货系列—(一)Java多线程基础
  3. 最喜欢的 jQuery 插件
  4. 编写高性能的 Lua 代码
  5. 【Android开发】布局管理器-线性布局
  6. 如何将Revit明细表导出为Excel文档
  7. 男人必看:最近在网上流传甚广的一个帖子
  8. 使用Nginx实现服务器反向代理和负载均衡
  9. 正则表达式和re模块知识点汇总
  10. Django Cache缓存系统介绍及Memcached使用