是否有可能弱化我自己的objective-c类?
我已经看到我可以弱连接函数或变量......
extern int MyFunction() __attribute__((weak_import));
extern int MyVariable __attribute__((weak_import));
我想有这样的东西......
if ([MyUploadManager class]) {
self.uploadButton.hidden = NO;
}
...即使项目中没有包含UploadManager.m也可以编译。
答案 0 :(得分:6)
弱连接一个类,例如您自己的可执行文件中的MyUploadManager
:
为了让链接器满意,请将其添加到项目中的Other Linker Flags
:
-Wl,-U,_OBJC_CLASS_$_MyUploadManager
这允许类符号未定义,即使它没有内置到您的可执行文件中。它将被视为动态查找,实际上与动态库符号相同。
为了让运行时满意,请将其添加到您的类标题中:
__attribute__((weak_import)) @interface MyUploadManager
当动态链接器运行时,它会用nil
替换类符号而不是崩溃。
现在您可以在没有链接器或运行时错误的情况下运行它:
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,那么在上面的示例中,该按钮将不会显示。