可以确定在运行时导入的类/可能忽略导入错误?

时间:2013-11-29 23:58:21

标签: objective-c cocoa-touch cocoa class import

问题1

我<99>肯定你无法确定一个类在运行时导入的其他类......但为了以防万一......这是你可以做的事情吗?

问题2

是否可以让您的应用忽略导入错误?即,即使您包含#import "IrrelevantClass.h"并且未在Xcode项目中包含IrrelevantClass.h/.m,有没有办法让您的应用仍然可以编译并运行?

(我正在做什么......)

我创建了一个自定义类RulesManager.h/.m,其中包含一些通用方法,用于根据给定的规则类RulesManager_<ProjectName>.h/.m采取适当的操作,其中每个Xcode项目都有自己的规则类。 (我们以Xcode项目MyProject为例,因此我们的两个文件将是RulesManager.h/.mRulesManager_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)用于实现这些规则背后的逻辑。

1 个答案:

答案 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,它告诉编译器对类型检查和名称安全性的需要。