查看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
)?
答案 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之间的桥梁,而不是与之相关联的额外框架。 击>
(通过@Catfish_Man)