Objective-C 没有名称空间; 它很像 C,所有东西都在一个全局名称空间内。通常的做法是在类前面加上首字母,例如,如果你在 IBM 工作,你可以在它们前面加上“ IBM”; 如果你在微软工作,你可以使用“ MS”; 等等。有时候项目的首字母是指项目,例如 Adium 类的前缀是“ AI”(因为项目背后没有公司可以使用首字母)。Apple 在类的前缀中加上 NS,并说这个前缀只为 Apple 保留。
目前为止一切顺利。但是将2到4个字母附加到前面的类名称是一个非常非常有限的名称空间。例如,MS 或 AI 可能有完全不同的含义(例如,AI 可能是人工智能) ,其他一些开发人员可能会决定使用它们,并创建一个同样命名的类。名称空间冲突。
好的,如果这是您自己的类和您正在使用的外部框架之间的冲突,您可以轻松地更改您的类的命名,没有什么大不了的。你的应用程序链接到他们两个,你会得到名称冲突。你打算怎么解决这些问题?什么是最好的方法来解决这些问题,使您仍然可以同时使用这两个类?
在 C 语言中,你可以通过不直接链接到库来解决这些问题,而是在运行时使用 dlopen ()加载库,然后使用 dlsym ()找到你正在寻找的符号,并将它分配给一个全局符号(你可以用任何方式命名它) ,然后通过这个全局符号访问它。例如,如果你有一个冲突,因为一些 C 库有一个名为 open ()的函数,你可以定义一个名为 myOpen 的变量,让它指向库的 open ()函数,因此当你想使用系统 open ()时,你只需要使用 open () ,当你想使用另一个函数时,你可以通过 myOpen 标识符来访问它。
Objective-C 中是否存在类似的可能性? 如果没有,是否有其他聪明、棘手的解决方案可以用来解决名称空间冲突?有什么想法吗?
只是为了澄清这一点: 建议如何避免名称空间冲突或如何创建更好的名称空间的答案当然是受欢迎的; 但是,我不会接受它们作为 答案,因为它们不能解决我的问题。我有两个库,它们的类名发生冲突。我不能改变它们,我没有任何一个的来源。撞击已经发生了,而提前知道如何避免的提示也不再有用。我可以将它们转发给这些框架的开发人员,并希望他们将来选择一个更好的名称空间,但目前我正在寻找一个解决方案,以便立即在单个应用程序中使用这些框架。有什么解决办法吗?