弱链接我自己的Objective-C类

时间:2014-05-29 21:44:48

标签: objective-c

是否有可能弱化我自己的objective-c类?

我已经看到我可以弱连接函数或变量......

extern int MyFunction() __attribute__((weak_import));
extern int MyVariable __attribute__((weak_import));

我想有这样的东西......

if ([MyUploadManager class]) {
  self.uploadButton.hidden = NO;
}

...即使项目中没有包含UploadManager.m也可以编译。

3 个答案:

答案 0 :(得分:6)

弱连接一个类,例如您自己的可执行文件中的MyUploadManager

  1. 为了让链接器满意,请将其添加到项目中的Other Linker Flags

    -Wl,-U,_OBJC_CLASS_$_MyUploadManager
    

    这允许类符号未定义,即使它没有内置到您的可执行文件中。它将被视为动态查找,实际上与动态库符号相同。

  2. 为了让运行时满意,请将其添加到您的类标题中:

    __attribute__((weak_import)) @interface MyUploadManager
    

    当动态链接器运行时,它会用nil替换类符号而不是崩溃。

  3. 现在您可以在没有链接器或运行时错误的情况下运行它:

    if ([MyUploadManager class]) {
      self.uploadButton.hidden = NO;
    }
    

    注意:从Xcode 7开始,-U链接器选项与BitCode冲突,因此您可能无法将此技术用于将来的项目。

答案 1 :(得分:2)

您可以使用NSClassFromString功能:

Class MyUploadManager = NSClassFromString(@"MyUploadManager");
if (MyUploadManager) {
    self.uploadButton.hidden = NO;
}
如果找不到该课,

NSClassFromString会返回nil

答案 2 :(得分:0)

要弱化一个类,它可以包含在框架中。可以告诉编译器使用Other Linker Flag构建设置弱链接框架中的所有符号。

-weak_framework <framework_name>

这使MyModule.framework在构建时能够与Uploader.framework进行弱连接。如果使用MyModule.framework的人没有链接Uploader.framework,那么在上面的示例中,该按钮将不会显示。

Frameworks and Weak Linking