如何高效的调试 IOS bug

wuhang89 发布于 2013年08月20日 | 更新于 2013年08月26日
无人欣赏。

我是一名正在自学IOS的码农,以前是做PHP的,对IOS崩溃不太会调试代码,所以程序一崩溃就懵了,今天写了个自动切换主题的类,一调用这个类在UIBarButtonItem 返回的时候调用 [self.navigationController popViewControllerAnimated:YES]; 就崩溃了,断点打在这个位置发现执行不下去,很奇怪,崩溃信息如下,

2013-08-20 21:42:40.586 Weibo[1247:907] -[__NSCFArray _isAncestorOfFirstResponder]: unrecognized selector sent to instance 0x74aa6d0
2013-08-20 21:42:40.689 Weibo[1247:907] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray _isAncestorOfFirstResponder]: unrecognized selector sent to instance 0x74aa6d0'
*** First throw call stack:
(0x15e1012 0x1406e7e 0x166c4bd 0x15d0bbc 0x15d094e 0x42cc33 0x441d82 0x5c8961 0x5c8658 0x444651 0x44489b 0x445dc6 0x446065 0x445015 0x168f6 0x141a705 0x34e2c0 0x34e258 0x40f021 0x40f57f 0x40e6e8 0x37dcef 0x37df02 0x35bd4a 0x34d698 0x1a5edf9 0x1a5ead0 0x1556bf5 0x1556962 0x1587bb6 0x1586f44 0x1586e1b 0x1a5d7e3 0x1a5d668 0x34affc 0x2b12 0x2a45)
libc++abi.dylib: terminate called throwing an exception
Printing description of argv:
(char **) argv = 0xbffff40c

另外如何高效的调试代码?

共4条回复
sycx 回复于 2013年08月20日

崩溃的原因是 -[__NSCFArray _isAncestorOfFirstResponder]: unrecognized selector sent to instance 0x74aa6d0

你可以写个NSAraray的Category, 实现_isAncestorOfFirstResponder方法,然后下断点.

_isAncestorOfFirstResponder 看名字应该是UIResponder类的一个私有方法

你应该是哪里类型转换错误了,误把一个array当作UIResponder(或者它的子类)了

WeZZard 回复于 2013年08月25日

按Cmd 7(Xcode 5), Cmd 6(Xcode 4)掉出左边的Breakpoints管理面板点左下角的加号,点Add Exception Breakpoint,然后运行,再崩溃的时候就会直接跳转到抛出异常的地方,当然,如果是苹果的框架有问题,那么调不到……

yelusiku 回复于 2013年08月26日

unrecognized selector的异常也有可能是悬挂指针(dangling pointer)引起的。

假设原来某变量存储了某个UIResponder子类实例的地址A,实例被释放后该指针没有被置0,而地址A被分配器回收后重新分配给了一个__NSCFArray的实例,之后就是_isAncestorOfFirstResponder的message被发给了__NSCFArray的实例导致异常

登录 或者 注册