Objective-C没有其他语言那种内置的命名空间(namespace)机制。
鉴于此,我们在起名时要设法避免潜在的命名冲突,否则很容易就重名了。
如果发生命名冲突(naming clash),那么应用程序的链接过程就会出错,因为其中出现了重复符号:
duplicate symbol _OBJC_METACLASS_$_EOCTheClass in:
build/something.o
build/something_else.o
duplicate symbol _OBJC_CLASS_$_EOCTheClass in:
build/something.o
build/something_else.o
错误原因在于:
- 应用程序中的两份代理都各自实现了名为EOCTheClass的类,这导致EOCTheClass所对应的类符号和元类符号个定义了两次。
解决方法就是:
-
倘若可以修改类名是最好不过的了。
-
倘若是使用了静态库,则编译静态库时,则需要在Build Phases -> Compile Sources 中去掉改类的.m文件,不将其编译进静态库。
要点
-
选择与你的公司、应用程序或二者皆有关联之名称作类名的前缀,并在所有代码中均使用这一前缀。
-
若自己所开发的程序库中用到了第三方库,则应为其中的名称加上前缀。
-
给C实现函数添加前缀(因为C函数名会作为顶级符号,出现在符号表中)。
-
需要注意的是:Apple宣称其保留使用所有“两字母前缀”的权利,所以你自己选用的前缀应该是三个字母或以上的。
网友评论