NSObject类是今天Objective-C运行时库的一部分(而不是Foundation组件)? [英] Is NSObject class a part of the Objective-C runtime library today (instead of being a Foundation component)?

查看:157
本文介绍了NSObject类是今天Objective-C运行时库的一部分(而不是Foundation组件)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

Looking at the Mac OS X 10.8's version of the Objective-C runtime library source code, I noticed that it's got a NSObject.mm file. As its name suggests, it's got the NSObject class implementation, as well as built-in autorelease pool and retain count implementations.

然而,Mountain Lion之前的ObjC运行时库的版本没有实现 NSObject 类(他们没有 NSObject .mm 文件,您可以在 Mac OS X 10.7的Objective-C运行库源代码)。

However, versions of the ObjC runtime library prior to Mountain Lion's one didn't implement the NSObject class (they didn't have a NSObject.mm file, as you can see at the Mac OS X 10.7's Objective-C runtime library source code, for example).

这真的意味着 NSObject 类现在是Objective-C运行时库的一部分,而不是Foundation库组件?如果是,为什么?当子类化 NSObject ? -framework Foundation >

So does this really mean that the NSObject class is now part of the Objective-C runtime library instead of being a Foundation library component? If yes, why? Is it to avoid one linking against the whole Foundation library (with -framework Foundation) when subclassing NSObject?

推荐答案

您可以使用nm(1)工具查看任何特定库的内容。

You can see what's part of any particular library using the nm(1) tool.

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

If you run this on libobjc, you'll find that NSObject is, in fact, provided by 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表示符号未定义,意味着此库使用它,来自其他地方。)

("t" means that the symbol is provided by this library; "u" means that the symbol is undefined, meaning that this library uses it but it must come from somewhere else.)

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

This isn't the first time they've moved NSObject's implementation; in Lion, you'll find it in CoreFoundation.framework.

我没有线索为什么他们移动它。无论如何,它是一个实现细节; 正式 NSObject仍然是Foundation a>。

I've got no clue why they've moved it around. At any rate, it's an implementation detail; officially, NSObject is still part of Foundation.

这篇关于NSObject类是今天Objective-C运行时库的一部分(而不是Foundation组件)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆