xcode 在静态库中链接Objective-C类别

jfgube3f  于 2023-05-30  发布在  其他
关注(0)|答案(3)|浏览(126)

我正在为iOS应用程序开发一个插件。我将它编译成一个.a文件,然后由主xcode项目使用。
到目前为止,我已经在这个库中创建了UIDevice类的类别。当我使用这个库运行主项目时,它由于无法识别的选择器而崩溃
-[UIDevice平台]:无法识别的选择器已发送到示例
平台是我通过类别添加的功能之一。
所以我认为它根本没有链接这些函数,并将一个c函数添加到与UIDevice类别相同的文件中,然后从我的代码中调用它。
这一次,项目进展顺利……所以我想可能是我做了别的事情,删除了C函数。但你瞧,它再次崩溃,由于无法识别的选择器。
我的问题:为什么xcode忽略类别定义,除非我调用同一个文件中声明的函数?
有没有一个xcode设置我可以改变,使它包括这些方法从UIDevice类别,无论我是否调用一个函数从该文件或没有?
欢呼

weylhg0b

weylhg0b1#

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

**要解决此问题,针对静态库的目标链接必须将-ObjC选项传递给链接器。**此标志会导致链接器加载库中定义Objective-C类或类别的每个对象文件。虽然此选项通常会导致更大的可执行文件(由于加载到应用程序中的额外目标代码),但它将允许成功创建有效的Objective-C静态库,其中包含现有类的类别。
重要:对于64位和iPhone OS应用程序,有一个链接器错误,它阻止-ObjC从只包含类别而不包含类的静态库中加载对象文件。解决方法是使用-all_load或-force_load标志。

来源:@albertamg(在静态库中链接Objective-C类别)

rn0zuynd

rn0zuynd2#

我也遇到过同样的问题。在子项目中定义的类别中定义的方法导致无法识别的选择器异常。(事实上,这表现为无法在Interface Builder中指定UILabel子类; XIB包含IB中显示的类(UILabel或UIView,取决于我拖到那里的内容),而不是我输入的类,这看起来是一个奇怪的XCode bug。
我的解决方案是使用-force_load:
在左侧面板中,选择主项目(根项)。在右侧,您将看到PROJECTTARGETS。选择TARGETS。转到“Build Settings”(在上面的栏中)--“Linking”--“Other linker flags”,假设您的子项目名为XXXXX,在那里添加-force_load ${BUILT_PRODUCTS_DIR}/libXXXXX.a(该项目有两个子项目,Debug和Release,但您单击此复合项目,以便影响Debug和Release)。
请注意,-force_load适用于单个库,您可能需要为每个子项目库指定单独的-force_load。

cs7cruho

cs7cruho3#

我遇到了这个问题,花了将近一个小时才解决。感谢上帝!已经完成了定义的方法必须是静态类型!

相关问题