当前位置: 首页 > 科技观察

Objective-C语言命名空间详解

时间:2023-03-12 02:53:22 科技观察

《为什么Objecive-C中很多类名都是NS开头的?》我保证你第一次跟别人介绍Objective-Ctalk的时候一定会听到这句话。就像父母要给孩子解释“什么是死亡”或者“圣诞老人不存在”一样,父母总是希望时间能让孩子自己找到答案。既然你问了,NS其实就是NeXTSTEP的缩写(好吧,其实是NeXTSTEP/Sun的缩写,我们只是简单介绍一下),它的用途是……越解释越让对方失望,接下来,他们不是随便问,而是开始问你更难解释的问题——Objective-C中的@是什么?命名一直是Objective-C的弱点,而Objective-C与更优雅的语言相比缺乏标识符容器,这招致了许多不切实际的批评。他们总是说:Objective-C没有像其他流行语言那样提供模块化机制来避免类名和方法名冲突。相比之下,Objective-C依靠前缀来确保应用程序中某些地方的方法名称不会影响其他地方的同名代码。在插入关于类型系统的题外话后,我们将继续讨论命名。C和Objective-C中的类型我在这个博客上多次提到。Objective-C直接建立在C语言之上。一个重要的原因是Objective-C和C语言共享一个类型系统。它们都要求标识符是全球唯一的。可以定义一个和@interface同名的静态变量,编译后会报错:@interfaceXXObject:NSObject@endstaticchar*XXObject;//重新定义“XXObject”为不同的符号即Objective-C运行时在C语言类型系统之上创建一个抽象层,它甚至允许编译以下代码:@protocolFoo@end@interfaceFoo:NSObject@1,@2,@3//@en@endObjective-C虽然代码繁琐但是它也有易于理解的明显优势。当我们作为开发人员讨论NSString时,我们不会将其理解为其他东西,编译器也是如此。我们在阅读代码的时候,不需要过多思考代码的作用。最重要的是,这个类名可以很容易地在谷歌等搜索引擎中找到。无论如何,如果您对此讨论感兴趣,我强烈建议您查看KyleSluder的《 this namespace feature proposal 》。非常值得一看。