一张图片引发的iOS8运行崩溃
背景:
在项目中偶遇一奇葩问题:APP运行在iOS9、iOS10上以及模拟器上没有问题,运行在iOS8上一打开就闪退。
调查问题:
通过Xcode排查,发现有日志输出:
malloc: *** error for object 0x170242490: Invalid pointer dequeued from free list
*** set a breakpoint in malloc_error_break to debug
多次运行,每次都有上边的日志输出,而且crash到main函数,出现EXC_BAD_ACCESS。Exception Breakpoint会指向一个imageNamed:函数,但不是一定的。
问题很怪异,通过崩溃日志锁定几个控制器,我把控制器从项目中注释,问题依旧存在。
没办法只能拿着错误日志找万能的度娘,终于让我发现有网友遇到和我一样的问题:Xcode升级到8,在IOS9和10上运行没问题,在IOS8上运行出错,在上边这篇文章的评论里寻根索源找到一篇参考文章:https://www.ianisme.com/ios/2409.html,文章里描述的现象跟我遇到的基本是一样的,我就尝试了里边定位到问题图片的方法。
解决方法:
步骤1. 在.ipa文件中找到Assets.car拷贝到桌面。
步骤2. 打开终端。
步骤3. 运行命令 :sudo xcrun --sdk iphoneos assetutil --info /Users/peter/Desktop/Assets.car > /Users/peter/Desktop/temp/Assets.json
其中/Users/peter/Desktop/Assets.car是Assets.car的全路径,/Users/peter/Desktop/temp/Assets.json是所有图片信息将要被导入到的一个全路径文件。
步骤4. 打开Assets.json,查找含有”DisplayGamut” : “P3”, “Encoding” : “ARGB-16″的内容。
步骤5. 找到内容的对应的图片名称。如下图:
步骤6. 找到图片money_test(是我截出来的临时图片,不小心放到Assets里了)。
步骤7. 在工程资源文件中找到并删掉这个问题图片(有些时候可能需要改变一下格式即可),然后重新运行APP,发现崩溃问题解决。