3

我正在制作一个框架,该框架具有一个扩展 UIView 以在 iOS 应用程序中使用的类。如果我只是使用故事板将视图放在屏幕上,那么这不足以强制链接器将我的类包含在应用程序中,所以我得到

Unknown class MyClassName in Interface Builder file. 

在应用程序中,我可以通过多种方式强制链接,但我想知道在我的 .framework 中是否可以做一些事情来强制应用程序链接到特定的类。

我尝试了一个我会在 C 中做的技巧,但它不是合法的 Objective-C。在我看来,在 .h 中,我尝试创建一个静态 Class 全局变量,就像这样

静态类 myClassInit = [MyClass 类];

这样,当应用程序包含我的 .h 时,此代码会将用法放在其编译单元中,希望强制链接。不幸的是,这不能编译,因为在编译时需要知道静态——我明白了:

Initializer 元素不是编译时常量

关于我可以对框架项目做些什么来强制应用程序链接到我的类,只需在情节提要中使用它并包括 .h,还有什么其他想法吗?

例如,还有其他问题的答案是向应用程序添加链接器标志或让应用程序调用[MyClass class]。我想要一个不会强迫应用程序制造商做任何超出正常使用类的任何事情的解决方案。

例如,是否有预处理器指令或其他 Objective-C 方式来强制链接?

以防万一您不知道这一点:拥有一个插座甚至设置视图的属性都不足以将其链接起来。

4

2 回答 2

3

我想出了一些有用的东西

如果你把它放在标题的底部,在 之后@end,它将强制链接

#define UNIQUENAME(s) s##__COUNTER__
Class UNIQUENAME(MyClassForceLink)()
{
    return [MyClass class];
}

您不能使用静态函数(链接器将其删除),并且如果您在应用程序中多次包含标头,则需要唯一的名称,以免多重定义的符号冲突。

于 2013-08-23T14:55:11.550 回答
1

故事板和 XIB 不是“代码”,而是序列化的对象图。链接器不会考虑/看到它们。同样,如果标头仅存在于项目中(通知 IB)但从未出现#import/#included在已编译的源文件中,则链接器同样将完全不知道它。您将需要#import/#include编译器和链接器实际看到的文件中的标头。(您甚至可能必须对某些东西进行“真实”引用,我不是 100% 确定这里的链接器语义。)

您可以将您的库作为“其他链接器标志”的一部分传递给链接器,但我不确定编辑构建设置比“#import将标头写入至少一个已编译文件”更容易。

于 2013-08-23T14:52:56.447 回答