作家
登录

浅谈iOS Crash(二)

作者: 来源: 2017-07-25 14:27:13 阅读 我要评论

2-3、排查之MLeaksFinder(强烈推荐)

MLeaksFinder是微信浏览团队为了简化内存泄漏排查工作,推出的第三方对象,也是我们当前衔目中内存泄漏的对象之一。

  • 特点:集成简单,重要检查UI方面(UIView 和 UIViewController)的泄漏。
  • 道理:不入侵开辟代码,经由过程hook 掉落 UIViewController 和 UINavigationController 的 pop 跟 dismiss 办法,检查ViewController对象被 pop 或 dismiss 一小段时光后,看看该ViewController对象的 view,view 的 subviews 等等是否还存在。
  • 实现:为基类 NSObject 添加一个办法 -willDealloc 办法,应用weak指针指向本身,并在一小段时光(3秒)后,再次检测该weak指针是否有效,有效则内存泄漏。
  • 集成:经由过程Cocoapods惹人或直接把代码拖进项目,很便利。产生内存泄漏,会弹出警告框,提示产生内存泄漏的地位。

解释:具体内容请参考:MLeaksFinder:精准 iOS 内存泄漏检测对象和MLeaksFinder 新特点

3、代码中的留意事项(ARC下的轮回引用是内存泄漏的重要原因)

  • 检查代码1 :Core Foundation、Core Graphics等操作

Core Foundation、CoreGraphics等操作不支撑ARC,还须要手动内存治理。

建议: 留意CF、CG对象的创建和释放。

  • 检查代码2 :NSTimer/CADisplayLink的应用,因为NSTimer/CADisplayLink对象的target会强引用self,而self又强引用NSTimer/CADisplayLink对象。

建议3: 如不雅须要弱引用OC对象,建议应用weak关键字,因为被weak指针所引用的对象被收受接收后,weak指针会被赋为nil(空指针),给nil发任何消息都不会出问题。应用weak润饰代劳对象属性就是很好的例子。

  • 检查代码2 :Core Foundation等底层操作

建议:应用扩大办法,应用block或 target弱引用目标对象 打破保存环,具体实现参考iOS实录8:解决NSTimer/CADisplayLink的轮回引用

  • 检查代码3 :block应用代码。

建议:查对应用weakSelf和strongSelf来打破block轮回引用(对于self没有引用的block是不会造成轮回引用,不须要应用weakSelf和strongSelf)

道理:在block外定义弱引用(weakSelf),指向的self对象;在block内捕获的是这个弱引用(weakSelf),包管了self不会被block所持有;在履行block内办法时,生成强引用(strongSelf),指向了弱引用(weakSelf)所指向的对象(self对象);在block内部实际是持有了self对象,然则这个强引用(strongSelf) 的生命周期只在这个block履行的过程中,block履行履行完急速就被释放了。

四、放弃内存(Abandoned Memory)

3)逻辑缺点监测(Logic error)

1、概述

  • 放弃内存(Abandoned Memory)指,依然被引用对象的内存,但在法度榜样逻辑中无法再被应用。
  • 排查该类问题建议应用Xcode供给的Allocation,Allocation可以跟踪应用的内存分派情况。

2、应用Allocation

  • Xcode供给的Allocation因为可以跟踪应用的内存分派情况。开辟者反复操作App,查看内存基线变更;甚至还可以设置Mark Generation来比较多次Generation之间的内存增长,这部分的增长就是我们没有及时释放的内存。经由过程Product-> Profile(快捷键command+i,唤起Instrument对象界面) -> Allocations。最后点击红色按钮开端“录制”,效不雅如下图:

Allocation界面Statistics Detail 下显示.png

  • 上图是Statistics Detail Type下的界面展示,下面是一些名称的解释:
DETAIL列名 解释 Graph 类型的选择项 Category 类型,或CF对象,或OC对象,或原始块的内存 Persistent Bytes 未释放的内存和大年夜小 Persistent 未释放的对象个数 Transient 已经释放的对象个数 Total Bytes 总应用内存大年夜小 Total 总应用对象个数 Transient / Total Bytes 已释放内存大年夜小/总应用内存大年夜小 ALLOCATION TYPE 解释 All Heap & Anonymous 所有堆内存和其他内存 All Heap Allocations 所有堆内存 All Anonymous VM 所有其他内存
  • 下图是切换到Call Tree下的界面展示。 

Allocation界面Call Tree下显示.png

CALL TREE列名 解释 Bytes Used 已经应用的内存大年夜小 Count 符号应用的总个数 Symbol Name 符号名称

解释:这些名词典具体解释见Instrument-Allocations

  • 距离一段时光(如2分钟)点击“Mark Generation”,断定几回之间Generation之间的内存增长,而这些增长可能就是未能及时释放的内存:根据内存占用的比例,找到占用比例最高的那部分,然后找到我们本身的代码,再来分析并解决问题。

      推荐阅读

      深度学习:简单而有局限性的求解方式

    深度进修:几何视角关于深度进修最令人吃惊的事实莫过于它的简单程度。10 年前,没人想到我们会应用简单的梯度降低参数模型在机械认知范畴取得如斯卓越的成就。如今,只须要在足够多的样>>>详细阅读


    本文标题:浅谈iOS Crash(二)

    地址:http://www.17bianji.com/lsqh/36391.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)