iOS OC内存分析优化~笔记

来源:互联网 发布:w10安装不了软件 编辑:程序博客网 时间:2024/06/05 16:24

//联系人:石虎  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等关键字,那么这些方法产生的对象,就必须在不再使用的时候调用1release或者1autorelease

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


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

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


3.block的注意

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

void (^test)() = ^{

    

};

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

Block_copy(test);

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

Block_release(test);

[test release];


谢谢!!!

原创粉丝点击