内存检测( Build And Analyze)

      作为一个半路出家的移动开发者来说,就我个人而言对于内存非常陌生的.一个在ARC环境下开发的孩纸来说,一味的追求效率,往往忽略了我们代码的耦合性,对内存的影响等等.最近公司需要更新客户端,问题来了ios客户端内存问题有么有了?答案是肯定的。

       在检测内存之前,我们需要知道ios内存检测工具,常见的有:Instruments的Leaks、Build And Analyze、Memory Graph、MLeaksFinder等。

      Build And Analyze:这种检测方法操作比较简单:只需要打开项目工程,选择Product→Analyze 或者快捷键command +  shift + B 即可。检测一会儿就会出现如下图一:



内存检测( Build And Analyze)_第1张图片
图一

这种分析内存的方法,速度快,不运行代码,分析代码的结构,我们在项目上线前可以简单的处理代码问题

        1 Dead Stroe:代码书写问题,一般会报错如下警告

        Value stored to 'xxx' during its initialization is never read(字面理解是初始化对象xxx无法在程序读取) 这个警告出现的原因有好多情况:如初始化了对象,但是没有使用,对象没有初始化,就开始使用 初始化了两次等等

内存检测( Build And Analyze)_第2张图片
图示二



内存检测( Build And Analyze)_第3张图片
图示三
内存检测( Build And Analyze)_第4张图片
图示四

         解决办法: 对于图示二 图示三 这类问题,一直存在工程中,宝宝也是大吃一惊,后来才知,工程维护的人多,哈哈哈 这就没办法了  图示四:是我常犯的错误,结构体或者对象没有初始化(startPt) ,就开始使用了;修改如下 CGPoint startPt = CGPointZero 

2 Core Foundction/Obeject-C

       这个问题,很容易被开发者忽略,没有遵循oc语音的特性,就随性上代码,也是笔者所犯的错误,废话少说,有图有证据!

内存检测( Build And Analyze)_第5张图片
图2-1

        OC所写的代码都是基本是继承与NSObject 的,所以有时候需要用super 去调用父类的方法,只有父类知道怎么去执行,子类要想实现 必须先调用父类的方法!  血泪啊 !


3 Apple Misuse(Apple)

       这类问题,是非常危险的!笔者的理解是,就是潜在的死循环的始作俑者,一旦上线崩溃,脸上会挂不住的!比如:


图3-1b

不可变字典对象(dict)value值不能为空,如果在某种情况下value = nil,程序直接崩溃,修复方式有两种方式:

第一种: 将快速定义不可变字典的({})方式改为:可变字典处理即可.

第二种:利用异常处理(Java中用比较多)方式,如下:

@try {

<#Code that can potentially throw an exception#>

} @catch (NSException *exception) {

<#Handle an exception thrown in the @try block#>

} @finally {

<#Code that gets executed whether or not an exception is thrown#>;

@try {

//插码需求,我的设置

NSDictionary *dict = @{@"WT.mobile":[UserLoginHelper sha

redInstance].userId,

@"WT.es":@"我的移动",

@"WT.event":item.title};

[WebtrendHelper sendEventWithActionAtPath:@"/wdyd" Description:@"wdyd" eventType:@"click" setCustomParameters:dict];

} @catch (NSException *exception) {

// 异常处理

} @finally {

}

4 Memory(Core Foundction/Obeject-C)

        通常会有这样的警告:potential leak of an object stored into XXX 意思是潜在的内存泄露,我们有时候用某个客户端,忽然之间消失了,打开又好了,笔者所遇到项目中,就有这类问题,测试发现,这类问题大多数是内存泄露引起的,不过因笔者的水平有限,单单用Build And Analyze分析是无法找到这些问题病根的;所写的代码在32位的操作系统上有卡死不动情况,真是蛋疼的节奏!不知道如何解决这些问题,望大神多多指教。


内存检测( Build And Analyze)_第6张图片
4-1

      图示4-1 是获取通讯录信息代码,addressBook出现了潜在的内存泄露,测试发现少量手机会崩溃,仔细检查代码发现如图(4-2);

内存检测( Build And Analyze)_第7张图片
4-2

修改如下即可:

内存检测( Build And Analyze)_第8张图片
4-3

5 Memory Error

   在内存检测中遇到了这样的警告"Use of zero-allocationed memory",不是很理解,图示如下:(是个地图导航类.mm文件中出现的)


内存检测( Build And Analyze)_第9张图片
5-1

      结束语: 内存问题一直存在与我们身边,只要写一行代码,内存读取过程中,都会有潜在的危险,就笔者而言,撸码还要很长路要走,希望和各位同行多多交流。望各位老司机给菜鸟留下宝贵的意见!!!

你可能感兴趣的:(内存检测( Build And Analyze))