iOS – 奇怪的例外

我在Xcode 4.2.1(启用ARC的项目)中遇到了一个奇怪的例外,那就是我无法追查到问题的根源。

这是exception情况:

2012-03-18 22:19:32.855 Project[14225:707] +[UIPickerTableViewTitledCell isEqualToString:]: unrecognized selector sent to class 0x3f2bbec4 2012-03-18 22:19:32.859 Project[14225:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIPickerTableViewTitledCell isEqualToString:]: unrecognized selector sent to class 0x3f2bbec4' 

什么是UIPickerTableViewTitledCell? 我想这是UIPickerView使用的一些内部类。 但是我并没有在我的项目的任何地方引用这个类。

我的应用程序被设置为一个选项卡栏应用程序与每个选项卡中的导航控制器,这个特定的选项卡有一个tableview和pickerview。

这听起来像你有一个过度释放的对象。 我在前ARC代码中得知,释放被多次调用。 代码听起来像是在寻找一个NSString发送isEqualToString:to,而不是获得已经释放的NSString,它得到这个UIPickerTableViewTitledCell的随机实例。

我会启用僵尸。 在Xcode 4.2.1中,您可以在菜单项Product > Edit Schemefind它。 转到Diagnostics标签。 然后有一个Enable Zombie Objectscheckbox。 这会让你的过度释放的对象变成一个僵尸,所以你可以找出究竟是什么对象造成你的崩溃。

我会阅读苹果文档技术说明TN2239:iOSdebugging魔术更深入的信息。 整个文档很棒,但是你可以先阅读“僵尸!”的章节。 和“更多僵尸!”