苹果8plus128G 您当前内存占用率过高怎么办过高,可能产生崩溃,请关闭后台其他应用后台其他应用适当没错

下面是小编整理的关于:“[标签:标题1]”的最新资讯!

  也许不少iPhone用户觉得,iOS后台有这么多APP应用肯定会十分耗电,关掉它们才能释放出更多的内存,让手机续航更久。但是关闭后台中的应用真的能让设备更流畅更省电吗?

  近日根据苹果软件工程部门的高级副总裁费德里奇表示,关闭后台中的应用并不能释放运行内存,而且还会对性能造成影响,以及耗费电量。

  大多数用户一直以来似乎都有一个误解,认为在后台运行的应用就应该要关闭,因为这可以帮助延长电池续航。不过,苹果博主 John Guba 也不同意这个“共识”。

  根据 Guba 表示,iOS 并不像电脑系统那样工作,后台的应用会被认定为“冻结”或暂停使用,ID锁 而这些之前使用的应用已经释放出了被使用的内存,也就意味着它们现在占用着更少的 CPU。Guba 认为,关闭所有应用实际上会使电池续航变得更糟。

  当用户强制关闭应用时,它们实际上会耗费更多的电池续航,导致在强制应用退出时切换应用的时间要长得多。由于后台的应用在短时间内被冻结或禁用,因此应用实际上未被使用或占用资源空间,这应该可以延长电池的续航。

  在广州的小伙伴如果iPhone出现故障的话,可以前往广州苹果售后维修中心,广州市天河区天河北路183号大都会广场9楼910室,让工程师进行故障检测,再确定维修方案以及维修价格。不在广州的小伙伴也别担心,可以拨打苹果维修客服电话热线:400-007-8800 进行咨询,也可以帮你查找离你最近的正规苹果售后维修中心。.

什么是崩溃日志,从哪里能得它?

iOS设备上的应用闪退时,操作系统会生成一个崩溃报告,也叫崩溃日志,保存在设备上。

设备与电脑上的iTunes Store同步后,会将崩溃日志保存在电脑上。根据电脑操作系统的不同,崩溃日志将保存在以下位置:

如果没有崩溃日志,试试点击Refresh 按钮刷新一下。如果你的应用还卖得不多,或者刚上架不久,iTunes Connect账号上也可能还没有任何崩溃日志。

如果iTunes Connect上有崩溃日志,你将看到如下图:

有时,尽管有用户报告闪退,你仍然看不到崩溃报告。这时,最好让用户直接把崩溃报告发送给你。

什么情况下会产生崩溃日志?

两种主要情况会产生崩溃日志:

1.应用违反操作系统规则。

违反iOS规则包括在启动、恢复、挂起、退出时watchdog超时、用户强制退出和低内存终止。让我们详细了解一下吧。

从iOS 4.x开始,退出应用时,应用不会立即终止,而是退到后台。但是,如果你的应用响应不够快,操作系统有可能会终止你的应用,并产生一个崩溃日志。这些事件与下列UIApplicationDelegate方法相对应:

上面所有这些方法,应用只有有限的时间去完成处理。如果花费时间太长,操作系统将终止应用。

注意: 如果你没有把需要花费时间比较长的操作(如网络访问)放在后台线程上就很容易发生这种情况。关于如果避免这种情况的信息,请参考我们的另外两篇教程: Grand Central Dispatch 和 NSOperations。

iOS 4.x开始支持多任务。如果应用阻塞界面并停止响应, 用户可以通过在主屏幕上双击Home按钮来终止应用。此时,操作应用将生成一个崩溃日志。

注意: 双击Home按钮后,你将看到运行过的所有应用。那些应用不一定是正在运行,也不一定是被挂起。

通常,用户点击Home按钮时,应用将在后台保留约10分钟,然后操作系统自动将其终止。 所以双击Home按钮显示的应用列表只是表明那是一系列过去打开过的应用。删除那些应用的图标不会产生任何崩溃日志。

在前台运行的应用拥有访问和使用内存的最高优化级。然而,这并不意味着该应用能使用设备的所有可用内存 ——每个应用只能使用一部分可用内存。

此时,为了让应用继续正常运行,操作系统开始终止在后台的其他应用以释放一些内存。所有后台应用被终止后,如果你的应用还需要更多内存,操作系统会将你的应用也终止掉,并产生一个崩溃日志。而在这种情况下被终止的后台应用,不会产生崩溃日志。

注意: 根据 苹果文档, Xcode不会自动添加低内存日志。你必需手动获取日志。 然而,根据我的个人经验,使用 Xcode 4.5.2, 低内存日志也会自动导入,只是”Process”和”Type”属性都被标为Unknown(未知)。

另外,值得一提的是在极短时间内分配一大块内存将给系统内存带来巨大负担。这样,也会产生内存警告的通知。

如你所想,大多数闪退都是由于应用中有Bug,因此大多数崩溃日志的产生都是因为应用中的Bug。Bug的种类的有很多。

在本教程的后半部分,你将通过调试一个会产生崩溃日志的含有Bug的应用,学习如何找到问题所在并进行修复!

让我们看看一个崩溃日志的实例,以使你在处理一些实际问题之前心里有谱。

事不宜迟,见见你的新朋友吧:

这报告看起来像天书。:) 我们分几部分来解读吧:

第一部分是闪退进程的相关信息。

CrashReporter Key 是与设备标识相对应的唯一键值。虽然它不是真正的设备标识符,但也是一个非常有用的情报:如果你看到100个崩溃日志的CrashReporter Key值都是相同的,或者只有少数几个不同的CrashReport值,说明这不是一个普遍的问题,只发生在一个或少数几个设备上。

Hardware Model 标识设备类型。 如果很多崩溃日志都是来自相同的设备类型,说明应用只在某特定类型的设备上有问题。上面的日志里,崩溃日志产生的设备是iPhone 4s。

Process 是应用名称。中括号里面的数字是闪退时应用的进程ID。

接下来几行不言自明,无需赘述。

这部分给出了一些基本信息,包括闪退发生的日期和时间,设备的iOS版本。如果有很多崩溃日志都来自iOS 6.0,说明问题只发生在iOS 6.0上。

在这部分,你可以看到闪退发生时抛出的异常类型。还能看到异常编码和抛出异常的线程。根据崩溃报告类型的不同,在这部分你还能看到一些另外的信息。

这部分提供应用中所有线程的回溯日志。 回溯是闪退发生时所有活动帧清单。它包含闪退发生时调用函数的清单。看下面这行日志:

帧编号—— 此处是2。

二进制库的名称 ——此处是 XYZLib.

第四列分为两个子列,一个基本地址和一个偏移量。此处是0×83000 + 8740, 第一个数字指向文件,第二个数字指向文件中的代码行。

这部分是闪退时寄存器中的值。一般不需要这部分的信息,因为回溯部分的信息已经足够让你找出问题所在。

这部分列出了闪退时已经加载的二进制文件。

第一次看到崩溃日志上的回溯时,你或许会觉得它没什么意义。我们习惯使用方法名和行数,而非像这样的神秘位置:

将这些十六进制地址转化成方法名称和行数的过程称之为符号化。

从Xcode的Organizer窗口获取崩溃日志后过几秒钟,崩溃日志将被自动符号化。上面那行被符号化后的版本如下 :

Xcode符号化崩溃日志时,需要访问与App Store上对应的应用二进制文件以及生成二进制文件时产生的 .dSYM 文件。必需完全匹配才行。否则,日志将无法被完全符号化。

所以,保留每个分发给用户的编译版本非常重要。提交应用前进行归档时,Xcode将保存应用的二进制文件。可以在Xcode Organizer的Archives标签栏下找到所有已归档的应用文件。

在发现崩溃日志时,如果有相匹配的.dSYM文件和应用二进制文件,Xcode会自动对崩溃日志进行符号化。如果你换到别的电脑或创建新的账户,务必将所有二进制文件移动到正确的位置,使Xcode能找到它们。

(注意: 你必需同时保留应用二进制文件和.dSYM文件才能将崩溃日志完整符号化。每次提交到iTunes Connect的构建都必需归档。

.dSYM文件和二进制文件是特定绑定于每一次构建和后续构建的,即使来自相同的源代码文件,每一次构建也与其他构建不同,不能相互替换。

如果你使用Build 和 Archive 命令,这些文件会自动放在适当位置。 如果不是使用Build 和 Archive命令,放在Spotlight能够搜索到的位置(比如Home目录)即可。)

因为低内存崩溃日志与普通崩溃日志略有不同,所以本教程特别分开说明一下。

iOS设备检测到低内存时,虚拟内存系统发出通知请求应用释放内存。这些通知发送到所有正在运行的应用和进程,试图收回一些内存。

如果内存使用依然居高不下,系统将会终止后台线程以缓解内存压力。如果可用内存足够,应用将能够继续运行而不会产生崩溃报告。否则,应用将被iOS终止,并产生低内存崩溃报告。

低内存崩溃日志上没有应用线程的堆栈回溯。相反,上面显示的是以内存页数为单位的各进程内存使用量。(在撰写本文的时候,一个内存页的大小是4KB。)

被iOS因释放内存页终止的进程名称后面你会看到jettisoned 字样。如果看到它出现在你的应用名称后面,说明你的应用因使用太多内存而被终止了。

低内存崩溃日志看起来像这样:

当应用发生低内存闪退时,你必需看看应用中内存使用的方式,以及是如何处理低内存警告的。你可以使用Instruments工具中使用Allocations 和 Leaks来发现内存分配问题和内存泄漏问题。如果你不知道如何利用 Instruments 检查内存问题,可以看看这个教程 。

本教程后面将会学习如何研究低内存崩溃日志。

在研究真实闪退场景之前,还有一点需要重点介绍一下:就是那些有趣的异常编码 。

你可以在报告的异常部分——前面代码的第3部分找到异常编码。有些编码比较常见。

通常,异常编码以一些文字开头,紧接着是一个或多个十六进制值,此数值正是说明闪退根本性质的所在。  从这些编码中,可以区分出闪退是因为程序错误、非法内存访问或者是其他原因。

下面是一些常见的异常编码:

0x8badf00d: 读做 “ate bad food”! (把数字换成字母,是不是很像 :p)该编码表示应用是因为发生watchdog超时而被iOS终止的。  通常是应用花费太多时间而无法启动、终止或响应用系统事件。

0xbad22222: 该编码表示 VoIP 应用因为过于频繁重启而被终止。

0xdead10cc: 读做 “dead lock”!该代码表明应用因为在后台运行时占用系统资源,如通讯录数据库不释放而被终止 。

0xdeadfa11: 读做 “dead fall”! 该代码表示应用是被用户强制退出的。根据苹果文档, 强制退出发生在用户长按开关按钮直到出现 “滑动来关机”, 然后长按 Home按钮。强制退出将产生 包含0xdeadfa11 异常编码的崩溃日志, 因为大多数是强制退出是因为应用阻塞了界面。

(注意: 在后台任务列表中关闭已挂起的应用不会产生崩溃日志。 一旦应用被挂起,它何时被终止都是合理的。所以不会产生崩溃日志。)

大展身手的时候到了!好了! 你已经学习了所有分析崩溃日志和修复错误的基础知识!

你的老板安迪要你帮忙解决几个用户经常抱怨闪退问题。你的任务就是研究这些闪退,符号化用户提供的崩溃日志,查找问题所在,并修复之。

你可以从 这里下载应用的源代码。

(注意: 如果你想自己重新生成崩溃报告,请遵照以下指引:

1.下载源码然后在Xcode中打开工程文件。

3.从Xcode工具栏上选择iOS设备——不是模拟器作为target,然后构建应用。

4.当你在设备上到默认页面(应用的全屏图片)时,立即在Xcode上点击停止按钮。

6.在设备上直接打开应用。

7.测试场景,完成后连接设备到电脑上,通过Xcode获取崩溃日志。)

场景 1: 糟糕的代码

一封来自用户的邮件: “大哥,你的应用就是一坨屎! 我将其下载到我自己的iPod Touch和iPhone上,还下载到我儿子的iPod Touch上。在所有的设备上,都是还没打开就闪退了……”

别一封来自用户的邮件说, “我下载了你们的应用,一打开就闪退。真悲催…”

另一封邮件说得更明确:”你们的应用不能运行。我把它下载到我和妻子的设备上。所有设备都是 一打开就闪退了…”

好吧,别灰心! 这些意见藏着什么玄机呢?让我们看看崩溃日志吧:

发现问题了吗? 异常编码是0xbadf00d,还有后面的报告:

这说明应用在启动时就闪退了,iOS的watchdog机制终止了应用。帅! 找到问题了,但是为什会发生这样的事呢?

跟应用源代码相关的帧是最重要的。忽略掉系统库和框架。下一个与代码相关的帧是:

不管如何,问题得你来修复了。这个调用必需异步进行,甚至更理想的情况是,在application:didFinishLaunchingWithOptions:返回YES之后的其他部分再执行Web服务。

在其他地方调用可能需要比较多的修改。当下,我们只要使应用不闪退就行。可以在日后再实现更好的设计。 将上面那行讨厌的代码(及其下面的三行代码)换成下面这个异步的版本吧:

场景 2: 无法响应事件的按钮

一名用户说: “我不能将某个rage master添加到书签里面。我想添加的时候应用就闪退…”

用一名用户说 :”书签不能用 … 在详细页面上,点击书签按钮,应用就闪退了!”

上面的抱怨说得不是很清楚,引起问题的原因肯定有多样。看看崩溃日志:

异常代码是SIGABRT。通常,  SIGABRT 异常是由于某个对象接收到未实现的消息引起的。 或者,用简单的话说,在某个对象上调用了不存在的方法。

这种情况一般不会发生,因为A对象调用了B方法,如果B方法不存在,编译器会报错。但是,如果你是使用selector间接调用方法的,编译器则无法检测对象是否存在该方法了。

回到崩溃日志。它指出闪退发生在编号为0的线程上。 这意味着很可能是在主线程上调用了某个对象没有实现的方法。

如果你接着阅读回溯日志,会发现跟你的代码相关的只有帧22, main.m:16. 这没有多大帮助。

继续向上查看框架调用,出现这个:

这不是你自己写的代码。但至少它确认了是对象调用了一个没有实现的方法。

看起来没什么问题,再检查一下storyboard (XIB文件) ,确认按钮连接的正确性。

当然,你也可以简单地在XIB文件上删除错误的连接,然后重新连接方法,使XIB文件连接到正确的方法上。两者方法都行。

又处理了一个闪退问题,好样的。

另一用户抱怨道, “在书签视图上无法删除书签…” 还有另一用户抱怨同样的问题, “当我试图删除书签时,应用闪退…”

这些邮件没什么作用,还是看看崩溃日志!

这看起来跟前面那个崩溃日志很像。是另一个SIGABRT 异常。 你可能想知道是否是相同的问题:发送信息到一个没有实现相应方法的对象?

让我们从回溯日志看看哪些方法被调用了。从底部开始,你的源代码最后被调用的是帧 6:

这是UITableViewDataSource 的一个方法. 呵呵?! 毫无疑问苹果已经实现了该方法 —— 你可以重载它, 但不像是还没有实现。而且,这是个可选的委派方法。 所以问题不是调用了一个没有实现的方法。

这些分析结合用户的抱怨,看起来是你在处理UITableView删除行过程中有Bug。回到Xcode。你知道看哪里吗 ? 能从崩溃日志中判断出来? 就是RMBookmarksViewController.m文件的第68行:

发现问题了吗? 给你点时间,仔细看一下。

找到了吧! 数据源呢? 代码在表格视图上删除了一行,但并没有修改背后的数据源。把上面的代码替换成下面的就能修复问题了:

搞定了!走起,讨厌的 bug!!

场景 4: 吃棒棒糖时闪退!

用户邮件说, “当rage master吃棒棒糖时应用就闪退…” 另一用户说, “我让rage master 吃棒棒糖,没几次应用就闪退了!”

这日志跟我们前面见到的相差很多。

这个一个来自iOS 6的低内存崩溃日志。正如我们前面所说的,低内存崩溃日志与其他类型的崩溃日志很不一样,它们不指向特定的文件和代码行。相反,它们画出了闪退时设备上的内存使用情况的图表。

接下来部分是低内存崩溃日志特有的:

Purgeable pages 是那部分可被清除或重用的内存。在上面的日志中,是0KB。

Largest process是闪退时使用大部分内存的应用名称,在上面的日志中,正是你的应用!

Processes显示了闪退时各进程列表,还包含内存使用量。包含进程名 (第一列), 进程唯一标识符(第二名), 进程使用的内存页数(第三列)。最后一列是每个应用的状态。通常,发生闪退的应用的状态是 frontmost。 这里是 Rage Masters, 使用28591 页 (or 114.364 MB) 内存——这内存太多了!

通过,最大进程和frontmost状态的应用是相同的, 而且也是引起低内存闪退的应用进程。但是也可能看到最大进程和 frontmost状态应用不同的例子。比如,如果最大进程是SpringBoard, 忽略它 , 因为 SpringBoard 进程是显示主屏幕的应用,出现在你双击home按钮等情况,而且它是一直活动的。

低内存发生时,iOS向活动的应用发出低内存警告并终止后台应用。如果前台应用仍然继续增长内存,iOS将终止它。

为了查找低内存问题的原因,你必需使用Instruments剖析应用。如果你不知道怎么做,可以看一下我们 一篇关于这个方面的教程.。 :] 另外, 你也可以走捷径,响应低内存警告通知,以解决部分闪退问题。

回到Xcode查看RMLollipopLicker.m文件。 这是实现吃棒棒糖的视图控制器。看看源代码:

当用户点击运行按钮, 应用开始一个背景线程,调用 lickLollipop 方法若干次,然后更新界面反映吃棒棒糖的数量。 lickLollipop 方法从属性列表文件(PLIST)文件读取一个长字符串,然后添加到数组上。这些数据并不重要, 能在不影响用户体验的前提下重新创建。

利用每种能够清除和重建数据而不影响用户体验的情况是好习惯。这样能够方便地释放内存,减少低内存警告。

万岁,你研究了4个闪退案例! 你的应用更完善了,并且学到了一些重要的调试技巧。

你可以到这里下载改进后的项目代码。

可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

内存不足而且没存东西,不排除应用使用留下的缓存占手机内存和后台运行的应用缓存。

关闭后台不必要运行的应用。
虽然频繁关闭“后台”只会加快iPhone 的耗电速度,但是对于一些平时不怎么用的应用,完全可以双击home键关闭它,只保留常用的即可。像定位导航和音乐类应用是常驻内存的,没用时最好关了。

经常使用 Safari 浏览网页时间久了会产生大量缓存数据,需要清空Safari的缓存来保持它的运行流畅。想要执行这个操作,需要进入【设置】>【Safari】,然后点击“清除历史记录”和“清除Cookies和数据”。

2,关闭自动更新自动下载。

如果iPhone6在使用时出现卡顿,那可能是因为它正在后台尝试应用升级,而这完全可以通过手动的方式执行。想要更改自动升级应用的设置,需要进入【设置】>【iTunes Store和App Store】>自动下载的项目,然后全部关闭。

3,删除旧的无用照片和视频。

删除不必要的文件是加速手机运行速度的主要方式之一。如果iPhone6当中存储了几百上千张照片以及很多的视频,可以将它们备份到电脑或是iCloud,然后在手机当中删除。毕竟手机内存空间有限,对于收藏照片来说,手机真不是一个好的地方。

4,删除占用大量空间的应用。

iPhone6越是臃肿,运行速度也就越慢。可以在【设置】>【通用】>【用量】当中查看到每款应用的空间占用,然后将那些占用空间大但并不是必要的应用删除。大量“僵尸”应用存在于手机上,只会拖累手机的运行速度。

5,删除旧的短信会话。

大量的短信也是拖垮手机速度的原因之一,有时短信多了,打开信息应用时要卡一下等待一会才能进入。如果搞不清楚手机为什么变卡,可以尝试删除手机当中那些无意义的垃圾短信。

6,关闭后台不必要运行的应用。

虽然频繁关闭“后台”只会加快iPhone6 的耗电速度,但是对于一些平时不怎么用的应用,完全可以双击home键关闭它,只保留常用的即可。像定位导航和音乐类应用是常驻内存的,没用时最好关了。

7,能手动执行的操作就不要开启自动模式。

当iPhone在进行任何自动操作时,比如搜索附近WiFi或升级应用,都会降低运行速度。想要关闭该功能,需要进入【设置】>【无线局域网】>【询问是否加入网络】,然后将其关闭。

在使用iPhone6时,大多数用户都会一直保持着开机状态,但定期重启手机其实是很有必要的。关闭手机可以帮助iPhone6摆脱那些一直在占用系统内存资源的东西。

我要回帖

更多关于 内存占用率过高怎么办 的文章

 

随机推荐