原文:http://blog.csdn.net/javayujiafeng/article/details/8445007
讲一个概念,虚拟内存。咱从windows说起,让大家好理解。在windows上,如果你电脑有1G内存,但是你的程序需要2G内存才能跑,那这个程序会崩溃掉么?答案是一般不会。windows有虚拟内存机制,大概的意思是,用硬盘去扩充内存。硬盘和内存本质都是存数据嘛,无非内存快,硬盘慢,如果一个程序需要的内存多到要用上虚拟内存,那么也只会变慢,但是不会崩溃掉。这个技术很好是么,iOS有没有呢,sorry,没有
好,这里讲讲为什么去掉了虚拟内存机制。手机和电脑一个很大的区别是,电脑上同时运行许多程序的需求很大,比如我现在就一边听音乐,一边还开着QQ,一边还开着浏览器,因为屏幕大呀,可以同时放下好多程序的窗口。有了虚拟内存,windows可以同时运行很多程序,万一内存不够用,就用虚拟内存顶上,至少各个程序只是性能变差,但是不会崩溃。除非你开非常多非常占内存的程序,需要的内存超过了内存和虚拟内存的总和,系统才会被迫让一些程序终止,这种情况还是很少见的,但是理论上是可能的。但是,手机屏幕只有那么点点大,往往只能显示一个程序的窗口,加上虚拟内存会显著降低性能,iOS索性取消掉了多个程序同时执行的能力,也取消掉了虚拟内存。用户看上去可能觉得不是这样,比如音乐播放程序是可以后台执行的,QQ看上去也在执行,还能收消息呢,其实这些都是假象,如果这帖子大家反馈不错的话,我再讲iOS的假后台吧。
OK,以上内容我们得到两个结论:1.iOS没有虚拟内存,在4s上能使用的内存就只有512M;2.没有后台能力,在用户按下HOME之后,程序就不执行了。我们从这两个结论和对比windows开始讲讲iOS内存如何管理的。先不考虑多程序运行,看看windows,假如我们打开QQ,QQ开始执行,占用一部分内存,QQ执行结束,这部分内存归还给操作系统;如果我们只是把QQ最小化,QQ还是会霸占着这部分内存,除非我们关闭QQ,内存才会归还给系统,so简单so容易理解,对么?来看看iOS,iOS不一样哦,一个程序被按了HOME之后,很像是最小化了对么,事实上它已经不执行了,但是是暂停状态而不是终止掉,当你再次点击QQ,QQ会回到屏幕上继续执行。而且在iOS上,一个被最小化的程序的内存是有可能随时被系统要回去的哦,这点和windows完全不一样,windows不会找程序要的,只有程序关闭后主动还给系统的。还有个很大的不同是,windows上的QQ什么时候终止运行是固定的,就是用户关闭QQ的时候;iOS又不一样了,因为iOS只有相当于最小化的HOME,那么QQ什么时候终止运行呢?当QQ被最小化,暂停了,而且正在运行的程序内存不够用的时候,系统会主动终止QQ,并要回QQ占用的内存,给正在运行的程序用。那么iOS上,一个没有BUG的程序(事实上世界上根本没有没有BUG的程序啦,这里假设有)什么时候会因为内存不够退出呢?答案是当系统释放掉所有最小化的程序,把所有内存都给这个正在运行的程序,但是它还是不够用,系统才会干掉它,它就闪退了(其实这个也蛮理想化的,没这么绝对,往往有内存泄漏的程序,占用内存的速度会超过系统给他分配内存的速度,而且从某种意义上说,即使这个程序不是内存漏了,而是就是需要这么多内存,这种也应该算广义的BUG了,是程序猿压根没设计好,PS:如果这个括号和上一个括号反而让你感觉无法理解的话,忽略这两个括号吧)。
有了前一楼的概念,我们大概知道了内存如何管理的。那么最近在iOS 6上因为内存不足而闪退的程序变多是为什么呢?咱们先来思考一个简单的问题。假设一个程序猿要写一个程序,这个程序需要的内存比较多,有可能超过系统的限制,注意只是可能,怎么办呢?我给出两种解决方案:1.这个程序时时刻刻关注自己用了多少内存,一旦要超过限制了,释放内存;2.这个程序只管用,系统在这个程序要用的内存快超过限制的时候告诉这个程序“你快爆炸了”,这时候程序去释放一些内存。哪种方便呢?我和绝大多数程序猿都选的第二种。第一种难度很大,虽然系统会尽力给程序最多的内存,但是系统回收内存也是要时间的,可能系统还没来得及给,程序就已经爆炸了,这个很难掌握,一个程序不可能知道有多少程序被最小化了,也不可能在一个具体的时间点上知道自己到底能用多少内存,还是等系统通知来的方便。
那么理论上,只要系统告诉程序,你要爆炸了,程序释放内存,一切安好。理论是这样的,但是细节上总不能保证你若安好便是晴天。iOS 3-5用的相同的方式告诉程序,你要爆炸了,iOS 6也会告诉,但是方式变了一点点,具体我写在最后,让有点程序设计知识的封釉看看。打个形象的比方,iOS 3-5会说,你要爆炸了。iOS 6开始说英语了,you gonna bomb,没及时更新的程序只懂中文不懂英语,没鸟系统,然后自己就真的爆炸了,闪退了。所以开篇我说,手动清理下内存可能有点用,但是用处不是很大,因为你可以尽量多提前清理出内存给程序用,程序内存不足的概率就降低了。可惜程序就是不鸟系统的话,运行时间长了还是会挂掉;而且,iOS 6细枝末节的更新很多,其他方面也可能引起BUG闪退,不过确实内存方面的原因占了绝大多数。真正的终极解决办法是,写程序的程序猿更新版本,让程序既可以听懂iOS 3-5的你要爆炸了,也能听懂iOS 6的you gonna bomb,才能让程序不再闪退,稳定运行。大部分程序猿都在努力更新中。用户们,可能只能先凑合下了,手动清理下,或许有效,只是或许。
好了,以上真正的原因我也讲完了,我尽可能简单通俗,希望能给大家带来点新姿势,咳咳,知识。最后写点编程方面的东西,没有编程知识的封釉可以评个分然后看其他帖子了。
iOS 3-5中,清理内存用的viewWillUnload和viewDidUnload,iOS 6开始系统不调用了,真心很操蛋呀,系统只调用那个什么receiveLowMemoryWarning了。有个解决办法,viewWillUnload和viewDidUnload可以不改,在receiveLowMemoryWarning里面,判断下系统版本,如果大于5,那么手动调一把viewWillUnload,然后自己干掉界面,self.view = nil;然后再调一把viewDidUnload,OK,下次进这个界面时候loadView和viewDidLoad还是会调用,又和iOS 3-5一样了,哇哈哈哈哈
相关推荐
第一次真机测试时,项目终于进入真机测试阶段,之前都是在Unity编辑环境下开发测试,运行的都很良好,信心满满的打包安装,结果闪退。。。,各种代码调试,跟踪都没什么线索。这怎么办?问题很可能出在了AOT的设置上...
### Unity iOS 启动闪退问题解析与解决方案 #### 一、问题背景 在使用Unity进行iOS应用开发的过程中,开发者可能会遇到一个常见的问题——应用程序在启动时出现闪退的情况。这种情况不仅会影响用户体验,而且会给...
"ios Crash闪退日志获取和上传至服务器"这个话题涵盖了以下几个关键知识点: 1. **Crash日志概述**:当iOS应用程序因某种原因无法正常运行并导致程序崩溃时,系统会自动生成一个Crash日志。这个日志包含了崩溃发生...
本文将深入探讨iOS App闪退异常的处理,以及如何通过代码实现有效的错误预防和修复。 首先,我们需要理解可能导致iOS App闪退的常见原因: 1. **内存管理问题**:Objective-C或Swift中的内存管理错误,如野指针、...
6. **忽视警告和日志提示**:项目中的黄色警告和日志警告可能是潜在崩溃的预兆,应在发布前处理这些警告并运行release模式进行测试。 7. **类型错误**:错误地将一个类型赋值给另一个不兼容的类型,如将字符串误作...
总的来说,解决iOS加载图片导致内存暴涨的问题需要深入理解图片处理的原理,合理使用系统提供的工具和API。同时,良好的编程习惯和性能监控也是确保应用稳定运行的关键。在开发过程中,应该持续关注内存使用情况,...
在iOS应用开发中,Xcode是苹果官方提供的集成开发环境(IDE),用于编写、测试和发布iOS和macOS应用程序。本资源"Xcode iOS 14, 13.6,13.7 真机调试包"是针对Xcode的特定版本,提供了对iOS 13.6和13.7设备进行真机...
资源名称:《iOS开发零基础入门教程》(40集)资源目录:【】传智播客《iOS开发零基础入门教程》1.1【】传智播客《iOS开发零基础入门教程》1.2【】传智播客《iOS开发零基础入门教程》1.3【】传智播客《iOS开发零基础...
在iOS 10上,用户报告了使用此插件时遇到的问题,主要表现为内存泄漏,最终可能导致应用突然退出(闪退)。内存泄漏是编程中的常见问题,当程序无法释放不再使用的内存时,会导致系统资源耗尽,影响应用的稳定性和...
在iOS开发中,遇到应用程序崩溃(闪退)是常见的问题,尤其在运行时。iOS的运行时系统(Objective-C Runtime)提供了一套强大的工具来帮助开发者处理这些问题。本篇文章将详细探讨如何利用运行时来避免iOS应用的闪退...
《iOS开发项目化入门教程》源代码是一份针对初学者的宝贵资源,旨在通过实际项目的实践,帮助开发者快速掌握iOS应用程序开发的基础技能。这个压缩包包含了一系列与iOS开发相关的源代码文件,这些文件反映了iOS应用从...
此外,iOS 9 还对内存管理和线程安全等方面进行了更严格的控制,这也可能导致某些旧版 JSON 解析库在新系统下运行不稳定。 JSONKit 在支持 iOS 9 时,针对这些变化做了相应的适配和优化。例如,它可能包含了 ATS ...
在本《iOS 10应用开发基础教程》中,我们将深入探讨如何利用Apple的Swift编程语言和Xcode集成开发环境(IDE)来构建适用于iOS 10操作系统的应用程序。iOS 10是Apple公司推出的一个强大且用户友好的移动操作系统,为...
《iOS 6 基础教程》是一本深入浅出的指南,旨在帮助开发者们掌握在iOS 6平台上开发应用程序的基础知识。随书源码下载提供了丰富的实例代码,让学习者能够通过实践来巩固理论知识。 一、iOS 6新特性 iOS 6是苹果公司...
在iOS应用开发中,遇到App连续闪退的情况是开发者必须面对的挑战。为了提供良好的用户体验并迅速解决问题,收集和分析crash日志至关重要。本文将详细介绍如何在iOS App连续闪退时有效地上报crash日志。 首先,了解...
《Beginning iOS 6 Development Exploring the iOS》是为初学者提供的一款iOS开发入门教程,英文版出版于2012年,适配了当时最新的iOS 6系统和相应的SDK。这本书旨在帮助有志于开发iPhone、iPod Touch和iPad应用的...
在iOS系统中,尤其是iOS10版本,用户隐私保护机制...通过上述步骤,你应该能够成功解决iOS10相册相机闪退的问题,让应用能够正常地访问相机和相册。同时,这也是对用户隐私的尊重,有助于提高应用的用户体验和信任度。