内存检测和离屏渲染的优化

  内存检查

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

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



图一

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

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

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

图示二



图示三
图示四

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

2 Core Foundction/Obeject-C

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

图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位的操作系统上有卡死不动情况,真是蛋疼的节奏!不知道如何解决这些问题,望大神多多指教。


4-1

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

4-2

修改如下即可:

4-3

5 Memory Error

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


5-1

离屏渲染

那么到底什么是离屏渲染详细可以拜读https://zhuanlan.zhihu.com/p/72653360

对当前App的界面进行了离屏渲染结果是黄色到处都是,这些界面是由UITabView实现,之所以会很多离屏渲染,主要有以下原因造成

(1) layer的cornerRadius属性和masksToBounds属性使用不当,以为只要使用了这两个属性,就会离屏渲染,这是大错特错的.

(2) 滥用layer的mask属性:控件切圆角.部分代码如下:


针对这两种情况,可以考虑如下优化:

(1) 考虑使用AsyncDisplayKit库,全面提升控件异步渲染性能.

(2) 视图阴影,圆角可以考虑用图片代替

(3)  如果无法用图片代替,cornerRadius属性和masksToBounds属性合理使用,让控件的合理的情况下触发设置圆角.

如对UILable的圆角设置:

let lable =UILabel.init(frame:CGRect(x:0, y:0, width:100, height:20))

    //设置背景色 给layer设置,圆角才有效

  lable.layer.backgroundColor = UIColor.white.cgColor

  lable.layer.cornerRadius=10;

(4) 减少对某个视图 某个方向切圆角 ...... 实在不行就core grapics绘制吧!!! 但性能稍微比mask好点.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容