iOS学习笔记3 - 命名空间

首先补充说明一下,这个系列不是教程,所以除了很可能会出错之外,而且不会按什么由浅入深的顺序来写。写什么主题完全看心情。

从C#转到Objective-c开发之后,会产生这么一个疑问:

Objective-C似乎没有命名空间?

没错。C++和C#有namespace,Java有Package(当然和Namespace有差别),我最近开始写的PHP也有如namespace com\example\johnslibrary\people;的命名空间,就连JavaScript。。。好吧让我们忘了JavaScript吧,它应该没有自带namespace(见http://elegantcode.com/2011/01/26/basic-javascript-part-8-namespaces/ 和 http://addyosmani.com/blog/essential-js-namespacing/)。


在开发C#的时候,经常会遇到不同NameSpace下有同样名字的类的情况。这时候就可以通过alias来区分。
比如

using n1=Namespace1;

using n2=Namespace2;



n1.ClassA=new n1.ClassA();

n2.ClassA=new n2.ClassA();

 

但Objective-C没有。 

类似c,所有的东西都运行在同一个全局的命名空间里。
所以在建立Objective-c的应用的时候,会有文本框,供输入前缀(prefix)。
“NS”是内置的Cocoa的前缀,表示NextStep。这个前缀被苹果占了。NextStep与Mac OS的关系就不多说了。

但相比CompanyA.XXX.YYY这样的通常NameSpace命名,前缀很容易冲突。如果我开了家叫MoeSoft的公司,前缀说不定就和微软冲突了。
如果同时引用了MS前缀的MoeSoft和Microsoft的类库就很可能悲剧了。

在stackoverflow有提出这样的解决方法:
用NSBundle来加载其中一个framework,然后复制并重命名,接下来加载另一个namespace。

另外还有一个建议是用@compatibility_alias来“重命名”类。

详细的可以看:
http://stackoverflow.com/questions/178434/what-is-the-best-way-to-solve-an-objective-c-namespace-collision

但如果能避免这个问题的话,还是尽量避免。那成语怎么说来着?君子不立危墙之下。

所以除非是在写最简单的测试代码,不然还是最好给自己的应用起一个足够长足够独特的前缀。

你可能感兴趣的:(学习笔记)