NSInvalidArgumentException',原因:' - [__ NSArrayM isValid]

时间:2011-03-08 15:34:28

标签: objective-c

任何人都可以告诉我崩溃的原因。

  

特定于应用程序的信息: * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSArrayM isValid]:无法识别的选择器发送到实例0x3f4a80'

2 个答案:

答案 0 :(得分:1)

您将选择器isValid发送到一个数组,该数组不响应该消息。没有看到代码,就可以说这一切。

答案 1 :(得分:0)

这是我的情况,

解决它:

将-all_load添加到构建设置中的其他链接器标志。

-all_load强制链接器从它看到的每个存档中加载所有目标文件,即使是没有Objective-C代码的文件。


更多描述:

由于标准UNIX静态库的实现,链接器和Objective-C的动态性质之间存在问题,因此发生“无法识别选择器”运行时异常。 Objective-C并未为每个函数(或方法,在Objective-C中)定义链接器符号-而是仅为每个类生成链接器符号。如果使用类别扩展现有的类,则链接器不知道将核心类实现的对象代码与类别实现相关联。这样可以防止在结果应用程序中创建的对象响应类别中定义的选择器。

要解决此问题,针对静态库的目标链接必须将-ObjC选项传递给链接程序。此标志使链接器加载定义Objective-C类或类别的库中的每个对象文件。虽然此选项通常会导致更大的可执行文件(由于将附加的目标代码加载到应用程序中),但它将允许成功创建包含现有类类别的有效Objective-C静态库。请按照以下步骤将-ObjC传递给链接器:

在Xcode中,双击“目标”下的目标名称。

在“项目”窗口中。从随后的“信息”窗口中选择“构建”窗格。

向下滚动到Linking集合下的Other Linker Flags构建设置,并将其值设置为-ObjC。