问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

IOS APP在用户设备发生crash,应该怎么修复

发布网友 发布时间:2022-04-26 09:58

我来回答

1个回答

热心网友 时间:2022-06-27 02:28

Crash原因

Crash原因有共性,归纳起来有:

�6�1 内存管理错误

�6�1 程序逻辑错误

�6�1 SDK错误 (部署版本< 编译版本)

�6�1 主线程阻塞

内存管理错误

内存管理是iPhone开发所要掌握的最基本问题,特别是使用引用计数手动管理内存的情况。内存管理错误包括:

�6�1 内存泄漏:未释放不会再使用对象。比如alloc忘记release,malloc忘记free。可用XcodeProct菜单下的Analyze功能来解决该问题;

�6�1 引用出错:引用已经被释放的对象指针。很多“莫名其妙”的Crash都是由于窗体经历的生命周期所导致的(viewDidUnload、viewDidLoad),在iOSSimulator里模拟内存警告就可以解决该问题;

�6�1 内存警告:App使用的内存超出设备的*,iOS将强制挂起App,强制挂起iOS是不会记录Crashlog,Flurry也无法记录。内存泄漏、快速/大量的分配内存都可能导致内存警告,这时候应该尽可能的释放不需要的资源。通过Instruments->Allocations里的Heapshot功能能够找出哪些资源未被释放。

WWDC 2012的Session242 - iOS App Performance_ Memory是专门讨论内存管理这个话题。

程序逻辑错误

数组越界、堆栈溢出、并发操作、逻辑错误。扎实的编码基础、严谨细致的工作习惯、清晰的思路可以避免这类错误;

SDK错误

这个错误出现的现象是有的设备运行正常,有的会Crash。原因是未找到框架、类、方法、属性。比如:用iOS5.0 SDK编译并运行在iOS4.0的设备上,5.0的Twitter框架在4.0的设备上找不到。这种问题常出现在用苹果新发布的Xcode编译原有的工程。

未找到框架的解决办法是:部署版本>= 编译版本。iOS框架向后兼容做的很棒,部署版本> 编译版本一般不会出现问题。

未找到类、方法、属性的解决办法是:先判断是否存在再使用

if(NSClassFromString(@"MFMailComposeViewController"))

respondsToSelector:

主线程阻塞

主线程阻塞超过10s,iOS将强制挂起App。把长时间的任务放到后台线程去执行,可使用NSThread,NSOperation, dispatch。WWDC2012的Session235 - iOS App Performance_ Responsiveness有详细的介绍。

解决Crash

思路是:定位Crash的程序代码,预测Crash原因,寻找解决方案,测试。

有多种方式可以定位Crash的程序代码:

�6�1 Debug模式时,iOSSimulator断点测试定位Crash的堆栈;

�6�1 真机连接iTunes查看Crashlog (Debug模式下);

�6�1 通过Flurry的错误记录查看;

定位之后,就是重新思考程序上下文逻辑,并有理由的预测Crash出现的原因。预测的越多,理解的越深。

寻找解决方案的方法有:

�6�1 浏览苹果官方SDK文档,找出错误原因;

�6�1 Google搜索Crash输出的信息,重点查找行业内技术论坛:cocoachina、stackoverflow、iphonedevsdk等;

�6�1 查看历届WWDC的视频、示例代码;

�6�1 在工程里添加环境变量: NSZombieEnabled、NSDebugEnabled,输出有价值的信息;

�6�1 如果未找到任何信息,可以寻求苹果官方论坛、业内技术论坛的帮助;

测试

找到解决方案后就需要测试,测试功能输入输出的准确性、程序性能、是否引入新的bug。测试有专业的测试工程师来负责,但开发工程师不能依赖测试工程师来发现问题,尽量独立解决已知存在的问题。

由于Xcode部署工程到真机上比较耗时间,如果可以的话尽可能用iOSSimulator来测试,以减少测试的时间。

建议开发工程师有一个checklist,在产品测试时自己逐一过一下上面常见的问题,这个能够避免大部分Crash。下图是我们一个产品的FlurryError记录,那120个错误Session是测试Crash时留下的。当然这个记录是没有包括iOS将强制挂起App的情况。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
ipad mini2怎么看小说 关于ipadmini的几点疑惑 苹果平板图书阅读软件推荐推荐一个苹果可以用的免费看小说app 风冷无霜为什么噪音大 华为matepad11多大尺寸的 applewatch可以发微信语音吗? 人类基因组组成 仅从染色体照片(黑白非显带的)能否区别X染色体和C组染色体? ...车子加速不上来是什么原因,节气门清洗过了也不行? 换了变数箱油洗了节气门 提速慢了 停下来起步根本没力气 玩命令与征服4出现gamecrash 是怎么回事 求三星手机密码破解 谁有&quot;手机指令大全&quot;?我手机密码忘记了... 上传APP因为crash被拒了,本地不发生,怎么解决 我的苹果6手机AD 卡锁了,请问如何解锁。 朋友捡了一个手机苹果6屏幕上显示iphone已停用连接iTunes 但是不知道ID号和密码这个自 戴尔windows10电脑我不小心进入安全模式,但是安全模式需要密码,那我怎么才能退出该模式呢? 怎么绕过icloud激活iphone 想恢复出厂设置密码忘了怎么办 iPhone6忘记ID密码了,怎么解锁? crash baggage密码锁怎么开 7看短信和微信都会闪退是什么原因 Win7开机桌面和任务栏没了怎么回事? 手机闪退是怎么回事? 三星I9003手机怎么无法连接移动网络? 新买的三星手机为什么无法连接到互联网 三星手机打开数据连接不能上网是什么情况? 三星手机移动数据连不上 三星s6手机移动数据连接不上怎么回事? 三星手机当使用apps时提示不能连接到移动网络上如何解决? 三星世界风手机,我的内存卡密码忘记了 怎么打开啊 那种行李箱好用? 索爱W580忘记了开机密码. 微信订阅号名字可以改吗?怎么改?详细点? 微信订阅号怎么改名字 微信公众号平台订阅号名字可以修改吗? 订阅号认证时,怎样修改订阅号名称 订阅号的名称和可以改吗? 已经认证的微信订阅号如何修改名称 微信公众账号订阅号的名称和在认证的时候可以改吗? 微信电脑版,多选图片保存到电脑为什么显示未保存? 企业微信打卡显示图片储存失败是什么原因? 微信图片保存失败是啥原因,怎样保存 电脑上微信图片多选后批量保存失败为什么? 电脑端微信图片点开显示下载失败也没有另存为按钮,重装了好几次了,缓存路径也改过了怎么办求大神 现在微信实名认证,如果用登其他软件会不会泄露个人信息? 什么是市盈率定价法 市盈率的定义是什么? 新股发行市盈率如何定? 什么是市盈率?是怎么算的。