您的位置:首页 > 移动开发 > IOS开发

关于IOS内存机制的较深入分析

2015-11-05 10:16 393 查看
首先说明这些是根据开发者们的文章复制黏贴组合得来的,有不正确的还请指正


懒得看的可以直接往下看结论

1内存调用机制
iOS本身的内存调用机制与Mac同源,但是与Windows有本质的区别。
Windows为了兼容古老和不规范的程序,允许程序直接控制硬件,导致windows系统权限不足,而许多Windows程序也不规范,因此在退出进程后往往许多内存并没有真正还给系统变成了空闲内存,导致时间一长系统可用内存越来越少,所以,Windows系统之下,需要一款软件进行内存优化并且及时释放空闲内存。
但Mac或者iOS却不是这样。Mac/iOS系统会将内存分为自由(free)、空闲(inactive)、活跃(active)以及固定(wired)四个类型,并且根据系统需要进行相互转化,所以如果系统本身没有Bug的话,内存一旦能够充足供应,系统就不会出现内存枯竭。
不过问题依旧产生了,随着iOS版本的升级,设备开始出现缓慢或者内存不足的现象。姑且忽略Bug的原因,其本质应该是系统越来越高的多进程需求,让低版本的设备内存开始吃力,而这并不是系统原因而是硬件原因。
2软件后台程序运行机制
下面 Speirs 描述了iOS是如何在后台处理程序的:
关闭 - 这个程序以彻底关闭或尚未被开启
待用 - 程序处于开启状态,但是并未收到任何指令(例如:程序开启但用户锁定了机器)
使用中 - 正常使用中的程序
后台 - 程序不在开启状态但仍然在后台运行代码暂停 - 程序仍然在使用内存但并未运行代码
技术上来讲,所有的程续在按Home键后只有5秒钟的后台时间,iOS在将这些程序变为暂停状态前给予它们一个非常有限的时间来清除所需清除的内容,之后程序变会被保留在记忆体中以便可以快速的开启它。
另外,当程序有特殊需求在后台运行更久而并非5秒钟时,Speirs 使用了 Instacast 做为例子对其进行了讲解,当 Instacast 正在后台下载 podcasts 时它会告诉iOS系统它正在下载东西,这样使得iOS系统给于其多10分钟的时间而并非5秒钟的时间,一但10分钟时限到达后
Instacast 将会被强制切换至暂停模式。当然还有相当一部分的程序是长期在后台工作的,如邮件、音乐、GPS、Voip、电子报等。这些程序都会一直在后台运行直至它完成它本身的任务。
3内存充足时应用释放内存的内在交换机制
iOS平台的内存管理采用引用计数的机制;当创建一个对象时使用alloc或者allWithZone方法时,引用计数就会+1;当释放对象使用release方法时,引用计数就是-1;这就意味着每一个对象都会跟踪有多少其他对象引用它,一旦引用计数为0,该对象的内存就会被释放掉;另外,iOS也提供了一种延时释放的机制AutoRelease,以这种方式申请的内存,开发者无需手动释放,系统会在某一时机释放该内存。
4内存不足时应用释放内存的内在交换机制
ios不是神级存在,也有内存不足的时候
由于iOS平台的内存管理机制,不支持虚拟内存,所以在内存不足的情况,不会去ROM上创建虚拟内存;所以一旦出现内存不足的情况,iOS平台会通知所有已经运行的app,不论是前台app还是后台挂起的app,都会收到 memory warning的notice;一旦app收到memory
warning的notice,就应该回收占用内存较大的变量;
1: app收到系统发过来的memory warning的notice;
2: app释放占用较大的内存;
3: 系统回收此app所创建的autorelease的对象;
4: app返回到已经打开的页面时,系统重新调用viewdidload方法,view重新加载页面数据;重新显示。
5结论
IOS不需要内存清理工具,系统会自动释放内存以保证流畅。
另外这些工具也无法对内存进行直接操作,除非越狱。
说白了IOS的后台相当于一个历史记录,只不过记录里的程序已经预先载入内存了。
如果未越狱的机器在运行第三方软件时卡了,那只能说明是硬件不行了,该换了。
再罗嗦一句,那些所谓的电池医生也都是骗人的,因为IOS根本没有api来允许程序干涉电池状态,唯一的几个关于电池的api只是用来看电量的罢了

最后附上一段视频,鸟语未翻译



视频来自:优酷
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: