问题1
我<99>肯定你无法确定一个类在运行时导入的其他类......但为了以防万一......这是你可以做的事情吗?
问题2
是否可以让您的应用忽略导入错误?即,即使您包含#import "IrrelevantClass.h"
并且未在Xcode项目中包含IrrelevantClass.h/.m
,有没有办法让您的应用仍然可以编译并运行?
(我正在做什么......)
我创建了一个自定义类RulesManager.h/.m
,其中包含一些通用方法,用于根据给定的规则类RulesManager_<ProjectName>.h/.m
采取适当的操作,其中每个Xcode项目都有自己的规则类。 (我们以Xcode项目MyProject
为例,因此我们的两个文件将是RulesManager.h/.m
和RulesManager_MyProject.h/.m
。)
目前,RulesManager_MyProject.h
导入RulesManager.h
,我的项目中的所有类都导入RulesManager_MyProject.h
,以便我的类可以调用类似[RulesManager shouldExecuteGivenParameters:parameters rulesClass:rulesClass]
的内容并采取适当的操作提供的参数和规则类中概述的静态规则,在本例中为RulesManager_MyProject.m
。 (希望这不是太混乱......)
但是,我不是在所有项目文件中导入RulesManager_MyProject.h
,而是在我的所有项目类中导入RulesManager.h
,并通过类似NSClassFromString([NSString stringWithFormat:@"RulesManager_%@", [[[[NSBundle mainBundle] bundleIdentifier] componentsSeparatedByString:@"."] lastObject]])
的内容获取规则文件。但是,这不起作用,因为您需要记住在编译之前通过#import "RulesManager_MyProject.h"
显式导入文件。一个“替代”的想法只是导入每个类中的所有相关RulesManager_<ProjectName>.h
文件,但是你会在上面的问题2中得到问题。
我想要做这样的事情的原因是我可以在我的所有Xcode项目中重用RulesManager.h/.m
类(不复制)并重用我使用规则管理器的类(再次,没有复制),而是简化我的方法调用,如[RulesManager shouldExecuteGivenParameters:parameters]
,并rulesClass
隐含基于当前的Xcode项目。
这个实现的好处是我在每个Xcode项目中都有唯一的中心文件(RulesManager_<ProjectName>.h/.m
),我可以指定独特的项目范围规则(例如,用于调试),同时还有一个跨项目共享的类(RulesManager.h/.m
)用于实现这些规则背后的逻辑。
答案 0 :(得分:1)
Q1。严格来说,这甚至没有意义,一个类不会导入任何东西。一个文件可以导入其他文件,但是(在objective-c中)这些文件可以有任意内容,多个类,只有类的一部分等等。无论如何,你无法在运行时告诉从哪里来的(除了可能读取你的文件)自己的二进制文件并检查调试符号?即使这样我也不认为你可以告诉导入什么内容。
Q2。不,错误是错误,因为编译器(这里实际上是预处理器)无法从中恢复。否则会收到警告(除非您使用-Werror
或其他一些铿锵选项)。
我想在我的所有项目类中导入RulesManager.h,并通过类似
NSClassFromString([NSString stringWithFormat:@"RulesManager_%@", [[[[NSBundle mainBundle] bundleIdentifier] componentsSeparatedByString:@"."] lastObject]])
的内容获取规则文件。但是,这不起作用,因为您需要记住在编译之前通过#import "RulesManager_MyProject.h"
显式导入文件。
你试过吗?在Objective-C中,类在运行时被解析,因此您可以使用编译器不知道的类。它对类型和名称安全性有害,但你可以做到。 import
只告诉编译器它应该处理指定的文件,通常(在objc中)包含一个@interface
,它告诉编译器对类型检查和名称安全性的需要。