5

查看Mac OS X 10.8 版本的 Objective-C 运行时库源代码,我注意到它有一个NSObject.mm文件。顾名思义,它有NSObject类实现,以及内置的自动释放池和保留计数实现。

但是,Mountain Lion 之前的 ObjC 运行时库版本没有实现NSObject该类(它们没有NSObject.mm文件,例如,您可以在Mac OS X 10.7 的 Objective-C 运行时库源代码中看到)。

那么这是否真的意味着NSObject该类现在是 Objective-C 运行时库的一部分,而不是作为 Foundation 库组件?如果是,为什么?子类化时是否避免与整个 Foundation 库(与-framework Foundation)链接NSObject

4

2 回答 2

7

您可以使用 nm(1) 工具查看任何特定库的组成部分。

如果你在 libobjc 上运行它,你会发现 NSObject 实际上是由 libobjc 提供的:

% nm /usr/lib/libobjc.dylib | grep -F NSObject
⋮
0000000000021688 t +[NSObject _isDeallocating]
0000000000021674 t +[NSObject _tryRetain]
0000000000021780 t +[NSObject allocWithZone:]
000000000002176e t +[NSObject alloc]
0000000000021699 t +[NSObject allowsWeakReference]
0000000000021712 t +[NSObject autorelease]
0000000000020fa6 t +[NSObject class]
000000000002115a t +[NSObject conformsToProtocol:]
00000000000217ea t +[NSObject copyWithZone:]
00000000000217e6 t +[NSObject copy]
000000000002178d t +[NSObject dealloc]
⋮

(“t”表示该符号由该库提供;“u”表示该符号未定义,表示该库使用它但它必须来自其他地方。)

这不是他们第一次移动 NSObject 的实现。在 Lion 中,您可以在 CoreFoundation.framework 中找到它。

我不知道他们为什么把它搬来搬去。无论如何,这是一个实现细节;官方上,NSObject 仍然是 Foundation 的一部分

于 2013-03-17T08:44:51.077 回答
3

NSObject 一直是,现在仍然是一个 Foundation 类。只有在运行时的这个迭代中,它的实现才开源(不要问我为什么,大果实以神秘的方式工作)。您最初不链接整个基础的假设是有缺陷的,考虑到 NSObject 深深植根于 Objective-C 的 C 方面和运行时库,它们是隐式链接的,而 Foundation 提供了许多也交互的类的根与事物的 C 端和运行时。将 Foundation 视为 C 和 ObjC 之间的桥梁,而不是要链接的额外框架。

正如 Peter 所说,NSObject 仍然是正式的基础类,但是,它最近被移入运行时库,以允许 libDispatch/libXPC 人员更多地关注 ObjC 方面(因为他们确实在这些库中使用 ObjC 类型) ,而不是每次需要向各自的框架添加一些东西时都必须修补 Core Foundation。

(通过@Catfish_Man)

于 2013-03-17T03:36:37.020 回答