我的崩溃报告服务显示了 iOS 应用程序的大量神秘崩溃。出于几个原因,我怀疑代码试图在没有特定选择器的对象上执行选择器。
如何静态分析代码以找到错误的选择器?
我正在 OS X 10.8 上使用 Xcode 4.6 编写 Objective-C 代码。我可以使用一个工具,它不会调用诸如调用 performSelector 之类的东西,其中选择器是从字符串构建的等等。我认为一个基本工具会起作用。
我的崩溃报告服务显示了 iOS 应用程序的大量神秘崩溃。出于几个原因,我怀疑代码试图在没有特定选择器的对象上执行选择器。
如何静态分析代码以找到错误的选择器?
我正在 OS X 10.8 上使用 Xcode 4.6 编写 Objective-C 代码。我可以使用一个工具,它不会调用诸如调用 performSelector 之类的东西,其中选择器是从字符串构建的等等。我认为一个基本工具会起作用。
从 Xcode 的“产品”菜单中选择“分析”。或按shift+ command+ B。
它对于识别 MRC 中的常规内存管理内容非常宝贵。但它对 ARC 程序仍然有用。
您可能还想尝试为所有异常设置异常断点。
我还建议您参考Xcode 用户指南的调试和调整您的应用程序部分。或者 Ray Wenderlich 的我的应用程序崩溃了,现在怎么办?系列。
顺便说一句,虽然分析器有帮助,但我认为它不会找到不正确的选择器。您可能想分享您如何使用选择器,因为您使用performSelector
的是,通常有更好的模式。有时您必须使用它,但通常还有其他更健壮的模式。或者,如果您绝对需要使用选择器,请添加运行时respondsToSelector
检查。例如:
NSAssert([object respondsToSelector:@selector(someMethod:)], @"%@ does not respond to selector someMethod:", object);
或者,如果选择器响应它,则有条件地执行选择器(这是您执行可能以特定 iOS 版本为条件的方法的方式):
if ([object respondsToSelector:@selector(someMethod:)])
[object performSelector:@selector(someMethod:)];