5

Mac OS X 10.8 の Objective-C ランタイム ライブラリ ソース コードのバージョンを見ると、 NSObject.mmファイルがあることに気付きました。その名前が示すように、NSObjectクラスの実装に加えて、組み込みの自動解放プールと保持カウントの実装があります。

ただし、Mountain Lion のバージョンより前の ObjC ランタイム ライブラリのバージョンは、NSObjectクラスを実装していませんでした (たとえば、 Mac OS X 10.7 の Objective-C ランタイム ライブラリ ソース コードNSObject.mmで確認できるように、ファイルがありませんでした)。 )。

これは本当に、そのNSObjectクラスが Foundation ライブラリ コンポーネントではなく、Objective-C ランタイム ライブラリの一部になったことを意味するのでしょうか? はいの場合、なぜですか? -framework Foundationをサブクラス化するときに、Foundation ライブラリ全体 (を使用) に対する 1 つのリンクを避けるため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 が相互作用する多くのクラスのルートを提供していることを考えると、Foundation 全体にリンクしないという最初の仮定には欠陥があります。物事のC側とランタイムで。Foundation は、リンクされる追加のフレームワークではなく、C と ObjC の間の架け橋と考えてください。

Peter が言ったように、NSObject はまだ公式には基礎クラスですが、libDispatch/libXPC 担当者が ObjC 側にもっと集中できるようにするために、最近ランタイム ライブラリに移動されました (彼らはこれらのライブラリで ObjC 型を使用しているため)。それぞれのフレームワークに何かを追加する必要があるたびに Core Foundation にパッチを適用する必要はありません。

(@Catfish_Man 経由)

于 2013-03-17T03:36:37.020 に答える