Cocoa/Cocoa Touch中的许多类都有NS前缀。这是什么意思?


当前回答

Cocoa框架的原始代码来自NeXTSTEP库基金会和AppKit(这些名称仍然被苹果的Cocoa框架使用),NeXTSTEP的工程师选择用NS作为他们的符号前缀。

因为Objective-C是C的扩展,因此不像c++那样有名称空间,符号必须有一个唯一的前缀,这样它们就不会发生冲突。这对于在框架中定义的符号尤为重要。

如果您正在编写一个应用程序,以便您的代码可能只使用您的符号,那么您不必担心这个问题。但是如果您正在编写供他人使用的框架或库,您还应该为您的符号添加一个唯一的前缀。CocoaDev有一个页面,许多Cocoa社区的开发人员列出了他们“选择”的前缀。您可能也会发现这个SO讨论很有帮助。

其他回答

NS基本上来自NextSTEP,这是苹果收购Next时最初的操作系统,后来成为Mac OS X。

我想解释一些其他的东西,这就是为什么需要它。

在c++中有命名空间,几乎所有的东西都放在std中

这就是为什么要使用std::string。

使用名称空间,这样就不会出错,而且可以编写自己的类字符串,而不会与系统字符串冲突。

Objective-C是C的超集,但它不包括命名空间,出于同样的原因,所有系统类都以NS或其他奇怪的前缀作为前缀。

这与所有DirectX类都以D3D为前缀,以及所有OpenGL类都以gl为前缀是一样的。

这意味着你不应该使用NS来命名你自己的类,当你在Core Animation中看到NS, CA或在Core Graphics中看到CG时,你就知道这是对系统框架的调用。

Swift改变了这一惯例,因为Swift支持命名空间,并将其核心类型(如String)映射到NS等等物。

当NeXT定义NextStep API(与NextStep操作系统相反)时,他们使用了前缀NX,如NXConstantString。当他们使用Sun(不要与OpenStep操作系统混淆)编写OpenStep规范时,他们使用了NS前缀,就像在NSObject中一样。

NeXTSTEP或NeXTSTEP/Sun取决于你问的是谁。

有一段时间,Sun在OpenStep上有相当大的投资。在Sun加入之前,基金会中的大多数东西,尽管当时还不叫基金会,前缀都是NX,代表NeXT,在Sun加入之前的某个时候,所有东西都被重命名为NS。S很可能并不代表Sun,但在Sun加入后,人们普遍认为它代表Sun,以纪念他们的参与。

实际上我有一个参考资料,但我现在找不到。如果/当我再次找到它时,我会更新这篇文章。

Bill Bumgarner又名@bbum,谁应该知道,他在2005年的CocoaBuilder邮件列表上写道:

Sun是在NS前缀开始发挥作用之后才进入的。NS前缀出现在从NeXTSTEP 3.0到NeXTSTEP 4.0(也称为OpenStep)的公共api中。4.0之前,a 少数符号使用NX前缀,但大多数类提供 系统库根本没有前缀——List, Hashtable, 看来,等等……

似乎每个人都同意,NX (NeXT)这个前缀在1993/1994年之前一直被使用,苹果的文档中写道:

1994年9月发布的官方OpenStep API是第一个将API分离为Foundation和Application Kit的API,并且第一个使用“NS”前缀的API。

它是NextStep (= NS)遗产。NeXT是乔布斯1985年离开苹果公司后成立的电脑公司,NextStep是它的操作系统(基于UNIX)以及Obj-C语言和运行时。NextStep连同它的库和工具,后来被重新命名为OpenStep(这也是NeXT和Sun一起开发的API上的名字),后来又变成了Cocoa。

这些不同的名字实际上很让人困惑(特别是因为有些名字只在字符是大写或小写时才不同..),尝试下面的解释:

TheMerger OpenstepConfusion