iPhone手机用户大多有一个习惯:用完的应用直接Home
键。因为大家都知道系统本身会帮我们管理这些应用的存活,这样就给我们iOS 开发带来了挑战!当运行内存吃紧的时候,要及时处理防止应用被杀。
手机运行内存越来越大2G,4G,8G……但是应用也越来越复杂了,所以我们很需要做一些预防措施。
内存分为虚拟内存和物理内存,这里要处理的就是物理内存。虚拟内存就是iOS特有的内存管理机制,用来弥补物理内存无法扩大的弊端。当你声明一块内存的时候最初只是在虚拟内存里,直到你使用的时候再回映射到物理内存,这种机制就大大减小了物理内存的压力。物理内存里的内容又分两块:一块是clean memory
主要是code、framework
反正就是这块内存不用你去管理,有系统自动回收。另一块就是Dirty Memory
系统无法回收,包括一些对象(ARC
下其实也不用你管)image缓存,caches
他们映射到物理内存上等待着你释放。
iPhone内存机制是这样的:当应用推到后台是,系统维护一个队列,队列里的应用按优先级区分,等内存警告的时候就按照优先级去kill。所以我们要做的就是收到内存警告的时候去清理应用的缓存释放物理内存,能有效预防被kill。如果收到内存警告不去处理3次可能就被kill了!!!
除了平时养成良好的代码习惯,还要注意一下内容:
1、处理内存警告
[uiapplationdelegate applicationdidreceivemeoryWaring]
[uiviewcontroller didreceivememorywaring]
Uiapplicationdidreceivememoryworingnotification
清除图片等占用内存多的资源
单例对象不要创建之后一直持有对象数据 警告时释放
隐藏的viewcontroller直接设置self.view=nil
代码如下:
-(void)didreceivermemoryworing{
[super didreceivememorywaring];
_testdata= nil;
}
2、降低内存峰值
lazyalloction path_one
直到使用时才分配 线程安全 不仅分配对象 还有资源文件
Calloc
替代malloc
设置清0
标记 只有读写操作的时候才会映射到物理内存并初始化
3、清理
crash
稍微大一点的图片把imagenamed
换成imagewithcontentoffile
不缓存
Releasepool 检测主线程分配过大内存或者快速分
4、大文件优化内存映射方式
[nsdata datawithcontentsoffile:path]
换成 [nsdata datawithcontentsoffile:path options:nadatareadingmappedifsafe error:&error]
同样是内存映射的方式 是有用的时候才会映射到物理内存 大文件使用
5、设置缓存机制
a、`nacache` 设置`totalcostlimit&countlimit ` 监听内存警告并删除所有的`cache`
b、`Nspurgabledata`适用于大数据低内存的时候自动移除
6、观察log文件
找到lowmemory.log
7、单例模块化
控制单例等全局变量
这样不仅优化了项目内存电量使用还能有效的后台保活了,赶快做起来吧!
网友评论