作家
登录

浅谈iOS Crash(二)

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

  •  
  •   CGContextDrawImage(context, CGRectMake(0, 0, smallBounds.size.width, smallBounds.size.height), clipImageRef); 
  •  
  •   
  •  
  •   UIImage* clipImage = UIGraphicsGetImageFromCurrentImageContext(); 
  •  
  •   
  •  
  •   UIGraphicsEndImageContext(); 
  •  
  •   CGImageRelease(clipImageRef);  //不添加,内存泄漏,会警告:Potential leak of an object stored into 'clipImageRef' 
  •  
  •   return clipImage; 
  •  
  •  
    1. //缺点做法,Analyzer分析后会告诉:Value stored to ‘dataArray’ during its initialization is never read 
    2.  
    3. NSMutableArray *dataArray = [[NSMutableArray alloc] init]; 
    4.  
    5. dataArray = _otherDataArray; 
    6.  
    7.   
    8.  
    9. //精确做法 
    10.  
    11. NSMutableArray *dataArray = nil; 
    12.  
    13. dataArray = _otherDataArray;  

    分析: dataArray已经被初始化分派了内存,然后被另一个可变数组赋值,导致一?数据源却申请了两块内存,造成了内存泄漏。

    eg:

    1. //缺点做法,Analyzer分析后会告诉:Property of mutable type ’NSMutableArray’ has ‘copy’ attribute,an immutable object will be stored instead 
    2.  
    3. @property (nonatomic, copy) NSMutableArray *dataArr;   
    4.  
    5.   
    6.  
    7. //精确做法 
    8.  
    9. @property (nonatomic, strong) NSMutableArray *dataArr;  

    分析: NSMutableArray是可变数据类型,应当用strong来润饰其对象。

    解释: Analyzer因为是编译器根据代码进行的断定, 做出的断定不必定会精确, 是以如不雅碰到提示, 应当去结合代码上文检查一下;还有某些造成内存泄漏的轮回引用经由过程Analyzer分析不出来。

    二、野指针(Wild pointer)

    2-2、排查之内存泄漏对象(Leaks)

    • Xcode供给的Leak可以赞助发明运行着的法度榜样内存泄漏的处所。经由过程选中Product-> Profile(快捷键command+i,唤起Instrument对象界面) -> Leaks。切换到Call Tree模式,底部选中Separate by Thread(按线程分开做分析)、Invert Call Tree(反向输出调用树)、Hide System Libraries(隐蔽体系库文件)。最后点击红色按钮开端“录制”,效不雅如下图:

    Leaks调试界面.png

    • 在Leaks调试界面上,1是Allocations 模板,显示内存分派情况;2是 Leaks 模板,这里可以查看内存泄漏情况。如不雅红X出现, 表示有内存泄漏;主框体区域则会显示泄漏的对象。Call Tree选项介绍如下: 
    CALL TREE 中选项 解释 Separate by Category 按类型分类,展开All Heap Allocations这一套显示的就是不合办法里堆内存的分派情况 Separate by Thread 按线程分开做分析,如许更轻易揪出那些吃资本的问题线程。特别是对于主线程,它要处理和衬着所有的接口数据,一旦受到壅塞,法度榜样必定卡顿或停止响应。 Invert Call Tree 反向输出调用树。把调用层级最深的办法显示在最膳绫擎,更轻易找到最耗时的操作。 Hide System Libraries 隐蔽体系库文件。过滤掉落各类体系调用,只显示本身的代码调用。 Flattern Recursion 拼合递归。将同一递归函数产生的多条客栈(因为递归函数会调用本身)归并为一条

      推荐阅读

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

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


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

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

    关键词: 探索发现

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

    网友点评
    自媒体专栏

    评论

    热度

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