小编典典

“未知类在 Interface Builder 文件中”在运行时出错

all

即使 Interface Builder 知道 a MyClass,我在启动应用程序时也会收到错误消息。

MyClass它是库的一部分时会发生这种情况,如果我直接在应用程序目标中编译该类,则不会发生这种情况。


阅读 91

收藏
2022-05-17

共1个答案

小编典典

尽管在运行时打印了“ Unknown class MyClass in Interface Builder file. ”错误,但此问题与
Interface Builder 无关,而是与链接器有关,链接器没有链接类,因为没有代码直接使用它。

当 .nib 数据(从 .xib
编译)在运行时加载时,MyClass使用字符串引用,但链接器不分析代码功能,只是代码存在,所以它不知道。由于没有其他源文件引用该类,因此链接器在生成可执行文件时会将其优化为不存在。因此,当
Apple 的代码尝试加载这样的类时,它找不到与之关联的代码,并打印警告。

默认情况下,Objective-C 目标将-all_load -ObjC默认设置标志,这将保留所有符号。但我从 C++
目标开始,但没有。尽管如此,我还是找到了解决这个问题的方法,它可以让链接器保持攻击性。

我最初使用的 hack 是添加一个空的静态例程,例如:

+(void)_keepAtLinkTime;

它什么都不做,但我会调用一次,例如:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

这将迫使链接器保留整个类,并且错误消失了。

正如 jlstrecker 在评论中指出的那样,我们实际上并不需要添加_keepAtLinkTime方法。只需调用现有的,例如:

   [MyClass class];

做的伎俩(只要你从 a 派生NSObject)。

当然,您可以在代码的任何位置调用它。我猜它甚至可能是无法访问的代码。这个想法是为了欺骗链接器,让链接器认为MyClass它在某处被使用,这样它就不会那么积极地优化它。

Xcode 6.3.2 & 斯威夫特 1.2

视图的快速定义。一定要覆盖init(coder aDecoder: NSCoder). 视图控制器的 Objective-C
定义。而且,梨树上的一个笔尖。

将模块名称添加到您选择课程的 Nib 详细信息检查器。

2022-05-17