iOS OC内存分析优化~笔记

//联系人:石虎QQ: 1224614774昵称:嗡嘛呢叭咪哄

一.内存分析

1.静态分析(Analyze)

不运行程序,直接检测代码中是否有潜在的内存问题(不一定百分百准确,仅仅是提供建议)

结合实际情况来分析,是否真的有内存问题

2.动态分析(Profile == Instruments)

1>运行程序,通过使用app,查看内存的分配情况(Allocations)

*可以查看做出了某个操作后(比如点击了某个按钮\显示了某个控制器),内存是否有暴增的情况(突然变化)

2>运行程序,通过使用app,查看是否有内存泄漏(Leaks)

*红色区域代表内存泄漏出现的地方

二.内存使用注意

1.加载小图片\使用频率比较高的图片

1>利用imageNamed:方法加载过的图片,永远有缓存,这个缓存是由系统管理的,无法通过代码销毁缓存

2.加载大图片\使用频率比较低的图片(一次性的图片,比如版本新特性的图片)

1>利用initWithContentsOfFile:\imageWithContentsOfFile:\imageWithData:等方法加载过的图片,没有缓存,只要用完了,就会自动销毁

2>基本上,除imageNamed:方法以外,其他加载图片的方式,都没有缓存

三.2个专业术语

1.内存泄漏

1>该释放的对象,没有被释放(已经不再使用的对象,没有被释放)

2.内存溢出(Out Of Memory)

1>内存不够用了

2>数据长度比较小的数据类型存储了数据长度比较大的数据

四.图片在沙盒中的存在形式

1.如果项目的Deployment Target <=6.x (不支持图片压缩)

1>所有图片直接暴露在沙盒的资源包(main Bundle),不会压缩到Assets.car文件

2.如果项目的Deployment Target >=7.x (支持图片压缩)

1>放在Images.xcassets里面的所有图片会压缩到Assets.car文件,不会直接暴露在沙盒的资源包(main Bundle)

2>没有放在Images.xcassets里面的所有图片会直接暴露在沙盒的资源包(main Bundle),不会压缩到Assets.car文件

3.总结

1>会压缩到Assets.car文件,没有直接暴露在沙盒的资源包(main Bundle)

*条件:"Deployment Target >= 7.x"并且是"放在Images.xcassets里面的所有图片"

*影响:无法得到图片的全路径,只能通过图片名(imageNamed:方法)来加载图片,永远会有缓存

2>不会压缩到Assets.car文件,直接暴露在沙盒的资源包(main Bundle)

*条件:除1>以外的所有情况

*影响:可以得到图片的全路径,可以通过全路径(imageWithContentsOfFile:方法)来加载图片,不会有缓存

4.结论

1>小图片\使用频率比较高的图片

*放在Images.xcassets里面

2>大图片\使用频率比较低的图片(一次性的图片,比如版本新特性的图片)

*不要放在Images.xcassets里面

五.苹果审核app,审核点

1>不会看app占用的内存是否很大

2>不会看app是否存在很多的内存泄漏

3>用户体验好不好(是否有很多的BUG :比如点5下崩4下)

4>是否包含了色情\暴力的内容(图片或者文字)

5>是否有实用价值(app上的功能至少要对部分用户人群有意义)

6> app中使用了私有API(使用的第三方库中可能会有私有API,比如曾经某个版本的百度地图)

7> ......

8>参考文章: http://blog.csdn.NET/kafeidev/article/details/9081531

六.私有API

1.苹果官方未公开的API

2.一般是不稳定或者比较底层的API(比如获得用户的短信内容\获得用户设备的UDID唯一标识)

3.一般在越狱开发中,才会大量使用私有API(比较少接触越狱开发)

4.如何判断某个功能是否可以实现(是否为私有API) :可以先参考AppStore是否有类似功能的软件

5.底层API !=私有API

七.设备信息相关的开发(非私有API,底层API)

1.设备的型号

2.设备的CPU型号\使用情况

3.设备的内存容量\使用情况

4.设备的硬盘容量\使用情况

5.......

6.推荐的第三方库

1>iOS-System-Services

*地址: https://github.com/Shmoopi/ios-System-Services

*实现思路:封装了很多模型(硬件模型\内存模型\进程模型,每一个模型对应着具体的功能)

*使用难易度:简单

2> uidevice-extension

*地址: https://github.com/erica/uidevice-extension

*实现思路:利用分类给UIDevice进行了扩展

*使用难易度:非常简单

八.如何让程序尽量减少内存泄漏

1.非ARC

* Foundation对象(OC对象) :只要方法中包含了alloc\new\copy\mutableCopy\retain等关键字,那么这些方法产生的对象,就必须在不再使用的时候调用1次release或者1次autorelease

* CoreFoundation对象(C对象) :只要函数中包含了create\new\copy\retain等关键字,那么这些方法产生的对象,就必须在不再使用的时候调用1次CFRelease或者其他release函数

2.ARC(只自动管理OC对象,不会自动管理C语言对象)

* CoreFoundation对象(C对象) :只要函数中包含了create\new\copy\retain等关键字,那么这些方法产生的对象,就必须在不再使用的时候调用1次CFRelease或者其他release函数

3.block的注意

// block的内存默认在栈里面(系统自动管理)

void(^test)() = ^{

};

//如果对block进行了Copy操作, block的内存会迁移到堆里面(需要通过代码管理内存)

Block_copy(test);

//在不需要使用block的时候,应该做1次release操作

Block_release(test);

[test release];

谢谢!!!

你可能感兴趣的:(iOS OC内存分析优化~笔记)