我的崩溃报告服务显示了iOS应用程序的大量神秘崩溃。出于某些原因,我怀疑代码正在尝试在没有特定选择器的对象上执行选择器。
如何静态分析代码以找到错误的选择器?
我在OS X 10.8上使用Xcode 4.6编写Objective-C代码。我没有使用一个工具,它不会调用诸如调用performSelector之类的东西,其中选择器是从字符串等构建的。我认为一个基本工具可以工作。
答案 0 :(得分:3)
从Xcode的“产品”菜单中选择“分析”。或按 shift + 命令 + B 。
它对于识别MRC中的常规内存管理内容非常有用。但它对ARC计划仍然有用。
您可能还想尝试为所有例外设置exception breakpoint。
我还会推荐您使用 Xcode用户指南的Debug and Tune Your App部分。或者Ray Wenderlich的My App Crashed, Now What?系列。
顺便说一句,虽然分析仪有帮助,但我认为它不会发现错误的选择器。您可能想要分享使用选择器的方式,因为您使用的是performSelector
,通常有更好的模式。有时您必须使用它,但通常还有其他更强大的模式。或者,如果您绝对需要使用选择器,请添加运行时respondsToSelector
检查。例如:
NSAssert([object respondsToSelector:@selector(someMethod:)], @"%@ does not respond to selector someMethod:", object);
或者,有条件地执行选择器,如果它响应它(这是你执行一个可能以特定iOS版本为条件的方法):
if ([object respondsToSelector:@selector(someMethod:)])
[object performSelector:@selector(someMethod:)];