我收到一个令我困惑的“无法识别的选择器”错误。
我知道我可以“po” LLDB 中的指针来了解接收器。但是有没有办法推断出哪个对象正在发送此消息?
谢谢!
如果您正在处理多个线程,回溯并不总是有帮助 - 您最终会在主线程上获得异常处理程序的回溯,这不一定是导致错误的那个。
但是,由于您知道特定类不存在特定的选择器,因此您可以通过使用类别将选择器添加到类中来作弊,然后在其上放置一个断点。
例如,对于这个错误:
-[__NSCFDictionary isEqualToString:]: unrecognized selector sent to instance 0x10004fb0
我们知道有些东西试图用“isEqualToString”调用“NSDictionary”。因此,将其添加到您喜欢的任何文件的末尾,在任何其他“@implementation”块之外:
@implementation NSDictionary(debug)
- (BOOL)isEqualToString:(NSString*)theString {
return FALSE;
}
@end
在此设置断点,重新运行您的代码,您将获得真正的堆栈跟踪。发现错误后不要忘记删除类别!
调试器中的命令bt
将向您显示一个回溯(stacktrace),它应该为您提供在该输出中某处启动消息的类。