转自点击打开链接
为了说明问题,我写了一个带Bug的Demo。
这个是Demo下载链接 : 点击打开链接 (ps:在Xcode 4.3 下写的这个demo特意留了几个bug和warming)
运行这个Demo需要在模拟器上面,在真机上也可以,只是展现的bug问题的顺序不一定一样。如图:
看吧,程序运行以后crash了。iOS 中crash主要分两种:SIGABRT(也叫EXC_CRASH) 和 EXC_BAD_ACCESS(他也可能会显示在SIGBUS或SIGSEGV下)。
SIGABRT型的crash相对容易排查,他是一种可控的crash。app在这个地方crash是因为系统识别出这非app想做的事。
而EXC_BAD_ACCESS型的crash相对难排查,因为他只在app, 通常是内存管理的问题。
可喜的是,这个Demo的是SIGABRT型的(后面还有bug,别急)。SIGABRT型的crash一般都会在Xcode的Debug输出栏(找不到Debug输出栏的同纸私聊)带有error描述(Xcode的右下方).就像下面所写:
Problems[14465:f803] -[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840 Problems[14465:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840' *** First throw call stack: (0x13ba052 0x154bd0a 0x13bbced 0x1320f00 0x1320ce2 0x29ef 0xf9d6 0x108a6 0x1f743 0x201f8 0x13aa9 0x12a4fa9 0x138e1c5 0x12f3022 0x12f190a 0x12f0db4 0x12f0ccb 0x102a7 0x11a9b 0x2792 0x2705) terminate called throwing an exception这个Debug输出栏的信息很重要,他提供了非常重要的Bug发生的位置的线索,比如这句:
[UINavigationController setList:]: unrecognized selector sent to instance 0x6a33840 |
这里的问题是UINavigationController(在内存地址为0x6a33840)调用的方法是 setList:
知道了crash引起的原因非常不错,但是你第一步要做的是找到crash发生的具体位置。
待续。。。。