iOS中造成dealloc不调用的原因

简介:

问题描述

最近在一个项目中用到了地图,发现在地图页面和上一个页面间反复切换回出现内存爆增的情况,就像吃了炫迈一样根本停不下来(直到app内存爆表,app闪退收场)。造成这一结果的根本原因是地图的mapView没有释放,导致每次打开地图界面的时候内存中都重新加载了一个地图mapView。于是在网上搜索了一番找到了解决办法,只需要在地图的ViewController中dealloc方法中释放掉mapView就行了。具体代码如下



以上给出的方法确实是对的,可以解决反复切换地图页面和地图上一级页面内存暴增造成的闪退问题。但是这里要说的不是这个问题,而是一个新的问题,我在dealloc中打了断点,但是dealloc根本就没有执行,所以mapView也就根本就没有释放,内存还是一样在暴增。为什么ViewController已经被pop了,而ViewController的dealloc方法却没有被调用?(按理说ViewController被pop的时候它的dealloc的方法应该被调用才对)。

解决办法

通过Google搜索终于在晚上找到了答案(大家就不要用百度,想要快速准确的找到自己想要的答案推荐大家用google)。造成ViewController不释放的原因可能有很多。遇到dealloc不调用的时候只需要检查您的ViewController中是否存在以下几个问题:

  1. ViewController中存在NSTimer

    如果你的ViewController中有NSTimer,那么你就要注意了,因为当你调用

    时,这个target:self就增加了ViewController的return count,如果你不将这个timer invalidate,将别想调用dealloc。

  2. ViewController中有关的代理

    一个比较隐秘的因素,你去找找与这个类有关的代理,有没有强引用属性?比如一个代理的delegate应该是 assign 的现在是retain,(╯‵□′)╯︵┻━┻,就是这个,它会影响你不让你调用dealloc,不信,就试试吧。(这个我还没有遇到过)。

  3. ViewController中有Block

    这个就是我我上面不进入dealloc的真正原因,Block体内使用实例变量也会造成循环引用,使得拥有这个实例的对象不能释放。
    例如你这个类叫OneViewController,有个属性是NSString *name; 如果你在block体中使用了self.name,那样子的话这个类就没法释放。
    要解决这个问题,MRC下只需

    ARC下将block 换为 weak

目前我所知道的就以上三种情况,如果有什么错误的地方或者还存在的一些情况,欢迎大家来补充。

=================

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeHMGoodsAddressSelectView)];

        [_backboard addGestureRecognizer:tap];

        tap = nil;//置空,否则没法dealloc释放资源 













本文转自ljianbing51CTO博客,原文链接: http://blog.51cto.com/ljianbing/1871801,如需转载请自行联系原作者






相关文章
|
JavaScript Android开发 iOS开发
html通过js调用ios或android代码
html通过js调用ios或android代码
89 0
|
JavaScript Android开发 iOS开发
html通过js调用ios或android代码
html通过js调用ios或android代码
|
Web App开发 JavaScript iOS开发
求助,主页面通过iframe访问ngnix中的子页面,子页面中利用调用js方法判断localstonge中是否有值,ios不可用,关闭阻止跨网站追踪,safari可用
紧急求助,主页面通过iframe访问ngnix中的子页面,子页面中利用调用js方法判断localstonge中是否有值,ios不可用,关闭阻止跨网站追踪,safari可用
|
算法 安全 JavaScript
IOS 某电商App签名算法解析(二) Frida RPC调用
IOS 某电商App签名算法解析(二) Frida RPC调用
IOS 某电商App签名算法解析(二) Frida RPC调用
|
JavaScript 安全 Android开发
Vue.js - 单页面 SPA ,IOS 端页面跳转后调用微信 JSSDK 时报错: "invalid signature" 解决方案
Vue.js - 单页面 SPA ,IOS 端页面跳转后调用微信 JSSDK 时报错: "invalid signature" 解决方案
414 0
|
开发工具 iOS开发
Flutter笔记 02:iOS调用多个flutter界面
Flutter笔记 02:iOS调用多个flutter界面
683 0
|
存储 编译器 Serverless
iOS-底层原理 33:内存管理(一)TaggedPointer/retain/release/dealloc/retainCount 底层分析
iOS-底层原理 33:内存管理(一)TaggedPointer/retain/release/dealloc/retainCount 底层分析
193 0
iOS-底层原理 33:内存管理(一)TaggedPointer/retain/release/dealloc/retainCount 底层分析
|
存储 开发者 iOS开发
iOS使用UIImagePickerController调用系统相机、相册与图库
iOS使用UIImagePickerController调用系统相机、相册与图库
269 0
|
iOS开发
IOS中调用系统拨打电话与发送短信
IOS中调用系统拨打电话与发送短信
145 0
|
iOS开发
iOS调用系统通讯录
iOS调用系统通讯录
194 0
iOS调用系统通讯录