即使 Interface Builder 知道 a MyClass,我在启动应用程序时也会收到错误消息。
MyClass
当MyClass它是库的一部分时会发生这种情况,如果我直接在应用程序目标中编译该类,则不会发生这种情况。
尽管在运行时打印了“ Unknown class MyClass in Interface Builder file. ”错误,但此问题与 Interface Builder 无关,而是与链接器有关,链接器没有链接类,因为没有代码直接使用它。
当 .nib 数据(从 .xib 编译)在运行时加载时,MyClass使用字符串引用,但链接器不分析代码功能,只是代码存在,所以它不知道。由于没有其他源文件引用该类,因此链接器在生成可执行文件时会将其优化为不存在。因此,当 Apple 的代码尝试加载这样的类时,它找不到与之关联的代码,并打印警告。
默认情况下,Objective-C 目标将-all_load -ObjC默认设置标志,这将保留所有符号。但我从 C++ 目标开始,但没有。尽管如此,我还是找到了解决这个问题的方法,它可以让链接器保持攻击性。
-all_load -ObjC
我最初使用的 hack 是添加一个空的静态例程,例如:
+(void)_keepAtLinkTime;
它什么都不做,但我会调用一次,例如:
int main( int argc, char** argv ) { [MyClass _keepAtLinkTime]; // Your code. }
这将迫使链接器保留整个类,并且错误消失了。
正如 jlstrecker 在评论中指出的那样,我们实际上并不需要添加_keepAtLinkTime方法。只需调用现有的,例如:
_keepAtLinkTime
[MyClass class];
做的伎俩(只要你从 a 派生NSObject)。
NSObject
当然,您可以在代码的任何位置调用它。我猜它甚至可能是无法访问的代码。这个想法是为了欺骗链接器,让链接器认为MyClass它在某处被使用,这样它就不会那么积极地优化它。
视图的快速定义。一定要覆盖init(coder aDecoder: NSCoder). 视图控制器的 Objective-C 定义。而且,梨树上的一个笔尖。
init(coder aDecoder: NSCoder)
将模块名称添加到您选择课程的 Nib 详细信息检查器。