//联系人:石虎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];