【问题标题】:iOS Static Library and NSInvalidArguementException erroriOS 静态库和 NSInvalidArguementException 错误
【发布时间】:2013-02-25 16:35:22
【问题描述】:

我成功创建了一个包含 LRResty API 以及我自己的许多类、函数等的 iOS 静态库。为了尝试测试我的库,我将它与库头文件一起复制到了一个新的 Xcode 项目中。在这个新的 Xcode 项目中,我调用了我的一个函数,该函数最终调用了 LRResty 函数 [LRRestyClient get:withBlock:]。然后抛出异常 NSInvalidArguementException unrecognized selector sent to instance。有趣的是,我可以右键单击函数(在静态库中)和“跳转到定义”,它知道函数定义的位置。

我知道抛出这个异常的原因有很多,有人知道还有什么原因吗?如果此描述过于模糊,我很乐意提供更多信息。或者任何人都可以向我解释如何将 LRResty 库成功打包到 iOS 静态库中?然后,我将使用此过程将其余的源文件打包在其中。

注意:我是创建静态库的新手,所以我可能忽略了一些非常简单的事情。我按照本教程创建了我的静态库:http://www.icodeblog.com/2011/04/07/creating-static-libraries-for-ios/

感谢您的帮助。

【问题讨论】:

  • 当您告诉调试器在抛出异常时中断时,您会看到什么?
  • 当我启用异常中断时,调试器会在 [[LRResty client] get:requestURL withBlock:^(LRRestyResponse *response) 行停止。我对汇编不太熟悉,我应该在堆栈跟踪中的汇编中寻找什么吗?
  • 我认为查看程序集不会有帮助。但如果我是你,我会查看块和 requestURL,看看我是否可以确定它们是否有任何问题。你得到一个 NSInvalidArgumentException。控制台是否显示有关异常的任何信息?通常,该异常来自操作系统获得错误值。也许如果它告诉你坏数据的地址,你可以检查它并确定可能有什么问题?
  • 有趣的是,如果我将 [[LRResty client] get:requestURL withBlock:^(LRRestyResponse *response) 直接放在测试应用的 ViewDidLoad() 函数中并包含 LRResty 标头,我会得到同样的错误。我知道关于静态库的基础知识(无论如何都不是专家)......难道我的库不包含 LRResty 的源代码(.m 文件)吗?
  • 好的,找到了我的问题的根源。 LRResty 使用类别,iOS 静态库不能很好地处理类别。看起来我需要包含一些链接器标志来解决问题。解决后我会报告解决方案。

标签: iphone ios objective-c xcode


【解决方案1】:

问题是 LRResty 库使用类别的结果。为了解决这个问题,我必须将编译器标志 -ObjC 和 -all_load 添加到构建目标 Other Linker Flags 部分。注意:这些编译器标志已添加到使用我创建的库的示例应用程序中。因此,任何使用我的库的应用程序都必须插入这些编译器标志。

以下是有关在 iOS 静态库中使用类别的更多信息:

Objective-C 没有为每个函数(或 Objective-C 中的方法)定义链接器符号 - >相反,仅为每个类生成链接器符号。如果您使用 >categories 扩展预先存在的类,则链接器不知道将核心类实现的目标代码 > 和类别实现相关联。这可以防止在生成的应用程序中创建的对象>响应类别中定义的选择器。

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

重要提示:对于 64 位和 iPhone OS 应用程序,存在阻止 -ObjC 从仅包含类别且不包含类的静态库中加载对象文件的链接器错误。 >解决方法是使用 -all_load 或 -force_load 标志。

以上信息是从这个Stackoverflow 答案中检索到的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多