一.测试如果图片放到image.xcassets里面图片放到哪里了
1.把图片放进去
2.打断点 po NSHomeDirectory()
3.前往文件夹
4.bundle如下
5.右键show in finder 发现图片在下图:
6.将部署版本改成7.1
7.发现没有了
总结:
资源打包
图片是被放到Images.xcassets里面
1.部署版本在>=iOS8的时候,打包的资源包中的图片会被放到Assets.car.图片有被压缩
2.部署版本在
3.图片是被直接拖入项目当中,无论部署版本是多少,都会被放到MainBudnle里面.图片没有被压缩
注意:如果你现在想要搞一个APP的资源,尽早搞.如果之后部署版本全部改成iOS8.资源会被放到Assets.car.
二.内存分配
大部分app闪退就是因为内存占用过大,被杀死
有时候我们想知道点击某个按钮或者销毁某个控制器的时候内存是增加还是减少
1.点击下图Profile
2.会打开Instruments
3.选第三个Allocations内存分配
4.选择当前的项目,点击录制(会自动把程序跑起来)
5.结果如下:
上图:第一行是总的内存=第二行是堆上分配的内存 + 第三行是虚拟内存
我们只看堆上分配的内存.所以勾选
6.加载图片的操作
7.点击屏幕内存情况如下图
可以看出使用imagenamed加载图片,之后图片并没有被销毁
总结:
1.使用imageName:加载图片
1>加载内存当中之后,会一直停留在内存当中,不会随着对象销毁而销毁
2>加载进去图片之后,占用的内存归系统管理,我们无法管理
3>相同的图片,图片不会重复加载
4>加载到内存当中后,占据内存空间较大
2.使用imageWithContentsOfFile:加载图片
1>加载到内存当中后,占据内存空间较小
2>相同的图片会被重复加载内存当中
3>对象销毁的时候,加载到内存中图片会随着一起销毁
结论:
1.如果图片较小,并且使用频繁的图片使用imageName:来加载(按钮图标/主页里面图片)
2.如果图片较大,并且使用较少,使用imageWithContentsOfFile:来加载(Tom猫/版本新特性/相册)
补充一个如何快速获取其他app资源的方法:
①.pp助手下载网易新闻
②把下载的ipa文件归档
③打开资源包,右键显示包内容
④所有资源如下
三,内存泄漏
什么内存泄漏?
堆里不再使用的对象,没有被销毁,依然占据着内存(该死的对象没有死掉)
1.静态内存分析
1>不运行程序,直接根据程序的语法结果,进行分析
2>相对不太准确,但是如果发现有地方提示可能有内存泄漏,最好根据实际情况查看一下
2.动态内存分析
如果发现内存泄漏,基本可以确定某一个地方确实发生的内存泄漏,之后根据实际代码情况来解决该问题
1.改成mrc环境
2.让内存泄漏(不release)
3.选择静态内存分析
4.提示可能有内存泄漏
动态内存分析:
1.打开instruments 点击进入leaks进行动态分析
2.跑起来程序发现有红色内存泄漏
小例子:在arc环境下基本不会内存泄漏,但是在CoreFundation框架下有可能会发生内存泄漏
测试代码如下(arc环境):
1.当使用静态分析会发现提示内存泄漏
release之后就不提示内存泄漏了
2.动态分析
同样的上面的代码使用leaks进行动态分明
①发现有内存泄漏
②点击最右边的方法列表(凡是黑色的有用户头像的都是我们可以改的,其他的都是系统调用的)
③双击黑色的drawrect进入如下界面,提示当前diamante行有50%的可能有内存泄漏
④点击xcode小图标就可以进入xcode修改了
补充:如何让程序尽量减少内存泄漏
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];
1.苹果官方未公开的API
2.一般是不稳定 或者 比较底层的API(比如获得用户的短信内容 \ 获得用户设备的UDID唯一标识)
3.一般在越狱开发中, 才会大量使用私有API(比较少接触越狱开发)
4.如何判断某个功能是否可以实现(是否为私有API) : 可以先参考AppStore是否有类似功能的软件
5.底层API != 私有API
1.私有API(公有API):越狱开发可能会使用到
苹果官方没有暴露给我们的API
官方禁止使用,如果发现应用程序有私有API,不允许上架
1>一般比较底层的API
2>不太稳定的API
3>不太希望开发者自己来定义的东西
四.获取硬件信息
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