Objective c 是否可以确定要在运行时导入的类/是否可以忽略导入错误?

Objective c 是否可以确定要在运行时导入的类/是否可以忽略导入错误?,objective-c,cocoa-touch,cocoa,class,import,Objective C,Cocoa Touch,Cocoa,Class,Import,问题1 我99%确定您无法确定一个类在运行时导入哪些其他类…但以防万一…这是您可以做的吗 问题2 是否可以让你的应用忽略导入错误?也就是说,即使在Xcode项目中包含#import“irrelationclass.h”而不包含irrelationclass.h/.m,是否有办法使您的应用程序仍能编译和运行 (我的意思是… 我创建了一个自定义类RulesManager.h/.m,其中包含一些通用方法,用于根据给定的规则类RulesManager.h/.m采取适当的操作,其中每个Xcode项目都有自

问题1

我99%确定您无法确定一个类在运行时导入哪些其他类…但以防万一…这是您可以做的吗

问题2

是否可以让你的应用忽略导入错误?也就是说,即使在Xcode项目中包含
#import“irrelationclass.h”
而不包含
irrelationclass.h/.m
,是否有办法使您的应用程序仍能编译和运行

(我的意思是…

我创建了一个自定义类
RulesManager.h/.m
,其中包含一些通用方法,用于根据给定的规则类
RulesManager.h/.m
采取适当的操作,其中每个Xcode项目都有自己的规则类。(我们以Xcode项目
MyProject
为例,因此我们的两个文件是
RulesManager.h/.m
RulesManager\u MyProject.h/.m

目前,
RulesManager\u MyProject.h
导入
RulesManager.h
,并且我的项目中的所有类都导入
RulesManager\u MyProject.h
,这样我的类就可以调用类似于
[RulesManager应该执行的参数:参数rulesClass:rulesClass]
并根据提供的参数和rules类中概述的静态规则采取适当的操作,在本例中为
RulesManager\u MyProject.m
。(希望这不会太混乱…)

但是,我不想在所有项目文件中导入
RulesManager\u MyProject.h
,而是想在所有项目的类中导入
RulesManager.h
,并通过类似
NSClassFromString([nsstringstringwithformat:@“RulesManager\u%@,[[[NSBundle mainBundle]bundleIdentifier]的方式获取规则文件组件由字符串分隔:@“.”]lastObject]])
。但是,这不起作用,因为您需要记住在编译之前通过
#import“RulesManager_MyProject.h”
显式导入文件。一个“替代”想法是只导入每个类中所有相关的
RulesManager_uuh
文件,然后您就得到了上面问题2中的问题

我希望这样做的原因是,我可以在所有Xcode项目中重复使用
RulesManager.h/.m
类(无需复制),并重复使用使用规则管理器的类(同样,无需复制),从而简化对
[RulesManager应基于当前Xcode项目隐式执行eGivenParameters:parameters]
,并使
rulesClass


这个实现的好处在于,我在每个Xcode项目中都有唯一的中心文件(
RulesManager.h/.m
),我可以在其中指定唯一的项目范围规则(例如,用于调试),同时在项目之间共享一个类(
RulesManager.h/.m
)用于实现这些规则背后的逻辑。

Q1。严格来说,这根本没有意义,一个类不导入任何内容。一个文件可以导入其他文件,但(在objective-c中)这些文件可以具有任意内容、多个类、仅一个类的一部分,等等。不管怎样,在运行时,您都无法分辨从何处来的内容(除了可能读取您自己的二进制文件和检查调试符号之外?即使这样,我也不认为您能说出导入了什么)

Q2.不,错误是一个错误,因为编译器(实际上是这里的预处理器)无法从中恢复。否则会收到警告(除非您使用
-Werror
或其他几个叮当声选项)

我想在我的项目的所有类中导入RulesManager.h,并通过类似于
NSClassFromString([NSString stringWithFormat:@“RulesManager”%@、[[[[NSBundle mainBundle]bundleIdentifier]ComponentSeparatedByString:@.]lastObject]]的方式获取规则文件
。但是,这不起作用,因为您需要记住在编译之前通过
#import“RulesManager_MyProject.h”
显式导入文件


您尝试过吗?在Objective-C中,类在运行时解析,因此您可以使用编译器不知道的类。这对类型和名称安全有害,但您可以这样做。
import
只告诉编译器它应该处理指定的文件,通常(在objc中)包含一个
@接口
,告诉编译器它需要什么样的类型检查和名称安全性。

谢谢!我没有意识到,如果不通过
#import
显式地“导入”类,您仍然可以调用它。在某个时候,我很想/我必须实际阅读Obj-C的工作原理,而不仅仅是使用它。