in Interface Builder file"运行时错误-6ren"> in Interface Builder file"运行时错误-即使 Interface Builder 能够识别 MyClass,我在启动应用程序时仍会收到错误。 当 MyClass 是库的一部分时,会发生这种情况,而如果我直接在应用程序目标中编译该类,则不会发-6ren">
gpt4 book ai didi

cocoa - "Unknown class in Interface Builder file"运行时错误

转载 作者:行者123 更新时间:2023-12-03 16:00:11 27 4
gpt4 key购买 nike

即使 Interface Builder 能够识别 MyClass,我在启动应用程序时仍会收到错误。

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

最佳答案

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

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

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

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

+(void)_keepAtLinkTime;

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

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

这将强制链接器保留整个类,并且错误消失。

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

   [MyClass class];

就可以了(只要你从 NSObject 派生)。

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

Xcode 6.3.2 和 Swift 1.2

View 的 Swift 定义。请务必重写 init(coder aDecoder: NSCoder)。 View Controller 的 Objective-C 定义。还有,梨树上的一个 Nib 。

将模块名称添加到 Nib 详细信息检查器中,您可以在其中选择类(class)。

关于cocoa - "Unknown class <MyClass> in Interface Builder file"运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1725881/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com