NSObject类现在是Objective-C运行时库的一部分(而不是Foundation组件)吗?

时间:2013-03-17 02:47:10

标签: objective-c cocoa foundation nsobject objective-c-runtime

查看the Mac OS X 10.8's version of the Objective-C runtime library source code,我注意到它有一个NSObject.mm文件。顾名思义,它有NSObject类实现,以及内置自动释放池和保留计数实现。

但是,Mountain Lion之前的ObjC运行时库的版本没有实现NSObject类(它们没有NSObject.mm文件,正如您在{{3例如)。

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

2 个答案:

答案 0 :(得分: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 is still part of Foundation

答案 1 :(得分:3)

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

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

(通过@Catfish_Man)