繁体   English   中英

Xcode 11.3 中的“无法为未定义的类定义类别”错误,无法访问源文件

[英]"Cannot define category for undefined class" error in Xcode 11.3, no access to source file

我正在尝试为在我无权访问的源文件中定义的类创建一个类别,即RunnerViewController

这里的两个重要文件是iPad_RunnerAppDelegate.hFilesBrowser.mm 我无权访问头文件的相应源文件。

iPad_RunnerAppDelegate.h包含 RunnerViewController 类的前向声明,并且可以毫无困难地引用该类。

但是,如果我尝试在FilesBrowser.mm #include "iPad_RunnerAppDelegate.h"然后尝试在同一个文件中创建一个类别,它无法识别类名。

在此处输入图片说明

尽管这个错误出现,我仍然可以使用里面的RunnerViewController类FilesBrowser.mm ,我不能让为它的类别。

这里发生了什么,我该如何解决?

我不得不做同样的事情,但那是很久以前的事了。 问题是,如果不指明在何处应用类别,您的代码就无法单独工作。 你需要的是编译器的信息,让它知道它将在哪里插入类别。

FilesBrowser.mm ,您将通过在“iPad_RunnerAppDelegate.h”之前添加以下内容来告诉它:

@interface RunnerViewController: UIViewController // or whatever it actually subclasses
@end

现在编译器知道它将针对名为RunnerViewController的 Objective C 类插入类别。

但是 - 你还没有完全完成。 现在您需要确保运行时/加载器在适当的时间执行类加载和类别插入。 这就是我的知识变得有点模糊的地方,所以它可能根本不是问题。

我认为需要先加载RunnerViewController类,然后在某个时候将您编写的类别应用于它(但这可能不是必需的)。 因此,如果RunnerViewController静态链接到您的应用程序(使用 .a 存档),那么您肯定很好。 但是,如果该类位于动态加载的 dylib 中,并且您的类别是静态链接的 - 那么这可能是一个问题。 我只是不知道 Apple 等待多长时间来尝试处理类别(顺便说一下-ObjC链接标志的用途。

无论如何,请先尝试上面的代码,然后看看会发生什么。 如果RunnerViewController是动态加载的,并且您遇到了一些严重的运行时错误,则有一种解决方法可以让您的类别进入一个也是动态链接的模块/框架,但在RunnerViewController之后RunnerViewController

最后,我相信你很有可能实现这一目标。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM