NS前缀是什么意思?

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

169365 次浏览

它来自NeXTSTEP遗产。

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

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

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

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

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

merger OpenstepConfusion .

NeXT年代TEP或NeXTSTEP/年代un取决于你问的是谁。

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

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

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

从# EYZ0:

(重点)

Cocoa类以首字母缩略词“NS”开始(代表 OpenStep的NeXT-Sun创建,或者原来的专有术语 对于OpenStep框架,NeXTSTEP): NSString, NSArray等

基础装备,或更常见的简单的基金会,首次出现在 # EYZ0。在Mac OS X上,它基于Core Foundation。基础是 提供字符串和值的通用面向对象库 操作,容器和迭代,分布式计算,运行 循环,以及其他没有直接绑定到图形化的函数 用户界面。中的所有类和常量使用“NS”前缀 该框架来自Cocoa的OPENSTEP遗产,它是由 由下一个太阳.

.开发

苹果的开发者文档如下:

如果你想知道为什么你遇到的这么多类都有一个NS前缀,这是因为Cocoa和Cocoa Touch的过去历史。Cocoa最初是用于为NeXTStep操作系统构建应用程序的收集框架。1996年苹果收购NeXT时,NeXTStep的大部分内容都被整合到了OS X中,包括现有的类名。Cocoa Touch作为iOS版的Cocoa问世;一些类在Cocoa和Cocoa Touch中都可用,尽管每个平台也有大量独特的类。 两个字母的前缀,如NS和UI (iOS上的用户界面元素)是保留给苹果使用的

来源:# EYZ0

比尔·布姆加纳又名@bbum,谁知道呢,在CocoaBuilder邮件列表上写道:

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

似乎每个人都同意前缀NX(代表NeXT)一直使用到1993/1994年,而苹果的文件说:

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

基本上,NS来自Next年代TEP,这是苹果收购Next时Mac OS X的原始操作系统。

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

在c++中有名称空间,几乎所有东西都放在性病

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

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

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

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

这意味着你不应该使用NS来命名你自己的类,当你在核心动画中看到NSCA或在核心图形中看到CG时,你就明白这是对系统框架的调用。

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