内存检查
在检测内存之前,我们需要知道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语音的特性,就随性上代码,也是笔者所犯的错误,废话少说,有图有证据!
OC所写的代码都是基本是继承与NSObject 的,所以有时候需要用super 去调用父类的方法,只有父类知道怎么去执行,子类要想实现 必须先调用父类的方法! 血泪啊 !
3 Apple Misuse(Apple)
这类问题,是非常危险的!笔者的理解是,就是潜在的死循环的始作俑者,一旦上线崩溃,脸上会挂不住的!比如:
不可变字典对象(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 是获取通讯录信息代码,addressBook出现了潜在的内存泄露,测试发现少量手机会崩溃,仔细检查代码发现如图(4-2);
修改如下即可:
5 Memory Error
在内存检测中遇到了这样的警告"Use of zero-allocationed memory",不是很理解,图示如下:(是个地图导航类.mm文件中出现的)
离屏渲染
那么到底什么是离屏渲染详细可以拜读https://zhuanlan.zhihu.com/p/72653360
对当前App的界面进行了离屏渲染结果是黄色到处都是,这些界面是由UITabView实现,之所以会很多离屏渲染,主要有以下原因造成
(1) layer的cornerRadius属性和masksToBounds属性使用不当,以为只要使用了这两个属性,就会离屏渲染,这是大错特错的.
(2) 滥用layer的mask属性:控件切圆角.部分代码如下:
针对这两种情况,可以考虑如下优化: