内存分析与硬件获取

(整理于网上资料与视频)

一.资源打包
图片是被放到Images.xcassets里面
1.部署版本在>=iOS8的时候,打包的资源包中的图片会被放到Assets.car.图片有被压缩
2.部署版本在< iOS8的时候,打包的资源包中的图片会被放在MainBudnle里面.图片没有被压缩
3.图片是被直接拖入项目当中,无论部署版本是多少,都会被放到MainBudnle里面.图片没有被压缩
注意:如果你现在想要搞一个APP的资源,尽早搞.如果之后部署版本全部改成iOS8.资源会被放到Assets.car.

结论:
1> 小图片\使用频率比较高的图片
* 放在Images.xcassets里面

2> 大图片\使用频率比较低的图片(一次性的图片, 比如版本新特性的图片)
* 不要放在Images.xcassets里面


二.内存分配
1.使用imageName:加载图片
1>加载内存当中之后,会一直停留在内存当中,不会随着对象销毁而销毁
2>加载进去图片之后,占用的内存归系统管理,我们无法管理
3>相同的图片,图片不会重复加载
4>加载到内存当中后,占据内存空间较大

2.使用imageWithContentsOfFile:加载图片
1>加载到内存当中后,占据内存空间较小
2>相同的图片会被重复加载内存当中
3>对象销毁的时候,加载到内存中图片会随着一起销毁

结论:
1.如果图片较小,并且使用频繁的图片使用imageName:来加载(按钮图标/主页里面图片)
2.如果图片较大,并且使用较少,使用imageWithContentsOfFile:来加载(Tom猫/版本新特性/相册)


三.内存泄漏
1.内存泄漏
堆里不再使用的对象,没有被销毁,依然占据着内存(该死的对象没有死掉)

2.内存溢出(Out Of Memory)
1> 内存不够用了
2> 数据长度比较小的数据类型 存储了 数据长度比较大的数据

解决内存泄露的方式:
1.静态分析(Analyze)
不运行程序, 直接检测代码中是否有潜在的内存问题(不一定百分百准确, 仅仅是提供建议)
结合实际情况来分析, 是否真的有内存问题

2.动态分析(Profile == Instruments)
1> 运行程序, 通过使用app, 查看内存的分配情况(Allocations)
* 可以查看做出了某个操作后(比如点击了某个按钮\显示了某个控制器), 内存是否有暴增的情况(突然变化)

2> 运行程序, 通过使用app, 查看是否有内存泄漏(Leaks)
* 红色区域代表内存泄漏出现的地方


四.私有API(公有API):越狱开发可能会使用到
苹果官方没有暴露给我们的API
官方禁止使用,如果发现应用程序有私有API,不允许上架
1>一般比较底层的API(可能拿到隐私方面的东西,短信、通话记录)
2>不太稳定的API
3>不太希望开发者自己来定义的东西(希望按照apple的规范来进行开发)
4>越狱开发当中可能使用


五.获取硬件信息(底层API)
1.该微博来自iPhone 6plus,QQ该说说来自小米手机(设备型号)
2.慕课网,查看硬盘使用情况(一共多少空间,目前使用多少空间)

设备信息相关的开发(非私有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进行了扩展
* 使用难易度 : 非常简单


六.苹果审核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


七.如何让程序尽量减少内存泄漏
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];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值