就在昨天,通过企业id发布了公司使用的一个iOS app 由于在真机调试没有发现问题。就直接替换了线上的文件。但是通过下载安装发现,开启程序后闪退,而且是每次都出现,这就让我感到非常迷茫,真机调试都是没问题的,为什么会出现如此严重的bug。立刻iPhone连接orgnizer。查看device logs 发现都是bad access错误,控制台也出现了Could not lookup ReleaseType from system version dictionary错误,我先检查了bad access定位的代码,没有发现问题。然后就查找releasetype的问题,对于这个问题网上相关资料很少,也没能帮我解决问题。我就继续从代码入手。发现都是与dispatch_queue 有关,我就把关于他的很多资料看了一遍,由于我是iOS5编译,iOS6运行,我就怀疑与dispatch_queue在5 6上的arc差异造成,然后从这个方向入手继续追查(其实我走错了道,后面说)。不断修改相关代码,重新发布,安装运行。由于通过xcode安装是没有任何问题的,因此只能这样调试。折腾下来,问题依旧。然后就在网上搜索所有相关资料。到了12点我依然没有解决问题。只能洗洗睡了,早上起来,脑子清醒了许多,抛弃了昨晚所有的想法,直接从代码入手,一句句注释掉代码,然后调试。仔细的检查代码。最终发现while 循环在应该退出的地方没有退出,会不会是这里的问题呢。修改之后,发布测试。一切正常。果然问题是这里造成的,至于为什么死循环在debug阶看不到问题,我现在还没有明白。
class="p1">
推荐一个关于 iOS Device logs调试的文章:
http://www.raywenderlich.com/23704/demystifying-ios-application-crash-logs
总结一下这次的经历:
1,这是一个愚蠢的bug。 while 死循环。测试没问题不代表发布的没问题,因为还有可能存在不同机型有不同的问题。
2,上线发布没有备份线上版本,造成我只能恢复最老的版本。以后不管什么情况的更新都要做到本分前一个版本。
3,由于没有备份 + debug没有问题,造成我心里紧张,慌乱之下找问题跑偏了方向,造成很多时间的浪费。一定要淡定,否则就乱套了,脑子也就不好使了。
4,没有仔细检查代码,否则早就搞定了。虽然第一次仔细检查了,但是不全面。仔细检查包括全面细致。
5,出现 Could not lookup ReleaseType from system version dictionary 错误 可能是由于代码问题造成。
6,dispatch_release 在 iOS6 arc下不需要使用了,但是在 iOS6以前的版本arc中需要 http://stackoverflow.com/questions/8618632/does-arc-support-dispatch-queues
为什么是一,因为以后还有可能有别的愚蠢出现