博客> 使用Leaks工具分析内存泄露及解决
使用Leaks工具分析内存泄露及解决
2018-08-17 01:01 评论:0 阅读:1135 yuqi6713
ios 内存泄露 内存泄露分析
    现在的应用开发绝大部分都是用ARC让系统自动管理内存。但在实际的开发过程中,即使在ARC下,也会遇到内存泄露的问题。这时候我们要学会使用工具来查找内存泄露进行调试分析和解决,保证自己的产品不要存在这些潜在的漏洞。

步骤: 一、内存理解和编码习惯 1、当调用这个对象的alloc、retain、new、copy方法之后引用计数器自动在原来的基础上加 1(ObjC中调用一个对象的方法就是给这个对象发送一个消息),当调用这个对象的release方法之后它的引用计数器减1,如果一个对象的引用计数器为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。 对象生成于堆之上,生成之后,需要一个指针来指向它。对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。 出现内存泄露是因为该对象的引用计数没减到0,未执行dealloc方法,一直占用内存,导致内存泄露。使用ARC自动内存管理一般不会出现此类内存泄露。 2、block出现内存泄露是循环引用导致的,a让finishBlock的引用计数加1,finishBlock在block块里也让a的引用计数加1,两者都等对方释放才能自己释放,造成循环引用,导致内存泄露。 A a = [[A alloc] init]; a.finishBlock = ^(NSDictionary paraments){ [a doSomething]; }; 对于这种在block块里引用对象a的情况,要在创建对象a时加修饰符block来防止循环引用。 block A a = [[A alloc] init]; a.finishBlock = ^(NSDictionary paraments){ [a doSomething]; }; 或 A __block a = [[A alloc] init]; a.finishBlock = ^(NSDictionary paraments){ [a doSomething]; }; 或者,需要在block中调用用self的方法、属性、变量时,可以这样写__weak typeof(self) weakSelf = self;在block中使用weakSelf。

__weak typeof(self) weakSelf = self; [b doSomethingWithFinishBlock:^{ weakSelf.text = @"内存检测"; [weakSelf doSomething]; }]; 3、代理的循环引用也会导致内存泄露。 A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。这种情况需要把delegate声明为assign属性。 4、死循环导致内存泄露。如果某个类对象中有无限循环,也会导致即使这个类对象对应的某个属性对象关掉了,这个类对象也不能被释放。

PS:第一次发帖,进行内存泄露分析的截图不知道为什么拖不进这个文章里。

二、静态分析内存泄露 使用Xcode自带的Analyze功能(Product-> Analyze)(Shift + Command + B),对代码进行静态分析,对于内存泄露(Potential Memory Leak), 未使用局部变量(dead store),逻辑错误(Logic Flaws)以及API使用问题(API-usage)等明确的展示出来。 静态分析的内存泄露情况比较简单,开发者都能很快的解决。这里不做赘述。

三、动态分析内存泄露 使用Xcode自带的Profile功能(Product-> Profile)(Command + i)弹出工具框,选择Leaks打开,选择运行设备点左上角的Record录制按钮,项目就会在已选好的设备上运行,并开始录制内存检测情况。

    选Leaks查看泄露情况,在Leaks的详细菜单Details选项里选调用树Call Tree,可查看所有内存泄露发生在哪些地方。再在右侧的齿轮设置-Call Tree-勾选Hide System Libraries,则可直接看内存泄露发生的函数名、方法名。点击函数名、方法名,可直接跳到函数方法的细节,可以看到哪一句代码出现了内存泄露,以及泄露了多少内存。
    接下来就要回到Xcode,找到出现内存泄露的函数方法,仔细分析如何出现的内存泄露。
    一般使用ARC,按照上面一提到的内存理解和编码习惯是不会出现内存泄露的。但我们在开发过程中,经常要使用第三方的一些类库,特别是涉及到加密的类库,用c或c++来编码的加密解密方法,会出现内存泄露。此时,我们要明白这些内存分配,需要手动释放。要一步一步看,哪里分配了内存,在使用完之后一定要记得释放free它。

    调试内存泄露是一件让人头疼的事,如果你不想头疼,请保持良好的编码习惯。并在开发到一个阶段时,就要及时对应用进行内存泄露分析。发现问题,及时修复。
    第一次写,考虑不周全,图片也拖不进来,待下次更新。
收藏
0
sina weixin mail 回到顶部