Objective-C没有名称空间;与C非常相似,所有内容都位于一个全局名称空间内。常见的做法是在类的前面加上缩写,例如,如果您在IBM工作,则可以给它们加上“ IBM”作为前缀。如果您为Microsoft工作,则可以使用“ MS”;等等。有时,缩写是指项目,例如Adium在类的前面加上“ AI”(因为后面没有公司可以使用缩写)。苹果为类添加NS前缀,并说该前缀仅保留给苹果。
到目前为止一切顺利。但是在类名前面附加2到4个字母是一个非常非常有限的名称空间。例如,MS或AI可能具有完全不同的含义(例如AI可能是人工智能),并且其他一些开发人员可能决定使用它们并创建一个同名的类。Bang,名称空间冲突。
好的,如果这是您自己的类之一与所使用的外部框架之间的冲突,则可以轻松更改类的命名,没什么大不了的。但是,如果您使用两个外部框架,这两个框架都没有来源并且您不能更改,那该怎么办?您的应用程序与它们两者都链接,您会遇到名称冲突。您将如何解决这些问题?以一种仍然可以同时使用两个类的方式来解决它们的最佳方法是什么?
在C语言中,您可以通过不直接链接到库来解决这些问题,而是在运行时使用dlopen()加载库,然后使用dlsym()找到要查找的符号并将其分配给全局符号(即可以以您喜欢的任何方式命名),然后通过此全局符号进行访问。例如,如果由于某些C库具有名为open()的函数而发生冲突,则可以定义一个名为myOpen的变量,并将其指向该库的open()函数,因此当您要使用系统open()时,您只需使用open(),当您要使用另一个时,可以通过myOpen标识符进行访问。
在Objective-C中是否可能有类似的事情,如果没有,是否可以使用其他聪明,棘手的解决方案来解决命名空间冲突?有任何想法吗?
更新:
只是为了澄清这一点:当然欢迎提出建议如何避免名称空间冲突或如何创建更好的名称空间的答案;但是,我不会接受他们作为答案,因为他们不能解决我的问题。我有两个库,它们的类名冲突。我不能改变他们。我没有任何一个的来源。碰撞已经存在,而有关如何提前避免的提示将不再有用。我可以将它们转发给这些框架的开发人员,并希望他们将来选择更好的名称空间,但是目前我正在寻找一种解决方案,以在单个应用程序中立即使用这些框架。有什么解决办法可以做到这一点?