5

the Mac OS X 10.8's version of the Objective-C runtime library source codeを見ると、NSObject.mmというファイルがあることに気付きました。その名前が示唆しているように、NSObjectクラスの実装と組み込みの自動解放プールと保持カウントの実装があります。NSObjectクラスは、(Foundationコンポーネントではなく)Objective-Cランタイムライブラリの一部ですか?

しかし、前にマウンテンライオンの1ににObjCランタイムライブラリのバージョンでは、(あなたがたとえば、Mac OS X 10.7's Objective-C runtime library source codeで見ることができるように、彼らは、NSObject.mmファイルを持っていなかった)NSObjectクラスを実装していませんでした。

これは実際にはNSObjectクラスがFoundationライブラリコンポーネントではなくObjective-Cランタイムライブラリの一部であることを意味していますか?はいの場合、なぜですか? NSObjectをサブクラス化するときにFoundationライブラリ全体(-framework Foundation)にリンクするのを避けるのはどうですか?

答えて

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」シンボルが定義されていないことを意味します。つまり、このライブラリはそれを使用しますが、他の場所から来ている必要があります)。ライオンで、あなたはCoreFoundation.frameworkでそれを見つけるでしょう。

なぜ私は彼らがそれを移動したのか分からない。とにかく、実装の詳細です。 は公式に,NSObject is still part of Foundationです。

+2

NSObjectが実装されている場所は実装の詳細です。 NSObjectはlibobjcと一緒にスタックの下に移動し、システムの多くがObjective Cを利用できるようになりました。 – bbum

+0

'NSObject'は(公式にもそうでなくても)もう財団の一部とは思われません。 [NSObject'のAppleの文書](https://developer.apple.com/documentation/objectivec/nsobject?language=objc)は、これを「Objective-C」フレームワークからのものとしてリストアップし、Foundationフレームワークについて言及していません。 – Cornstalks

3

NSObjectは常にFoundationクラスであり続けています。実行時のこの繰り返しでは、その実装がオープンソースであっただけです(なぜ、大きな果実が神秘的な方法で動作するのか聞かないでください)。 NSObjectがObjective-CのCの側面と暗黙的にリンクされているランタイムライブラリに深く根ざしていることを考慮すれば、Foundation全体とリンクしていないというオリジナルの仮定は間違いです。また、Foundationは相互作用する多くのクラスのルートを提供します物事のC面とランタイムと。 Foundationとリンクする余分なフレームワークではなく、CとObjCの間の橋渡しと考えてください。

NSObjectはまだ公式には基礎クラスですが、最近ではlibDispatch/libXPCの人たちがObjC側にもっと集中することを可能にするためにランタイムライブラリに移されました(ObjCこれらのライブラリの型)を、それぞれのフレームワークに何かを追加する必要があるたびにCore Foundationにパッチを適用する必要はありません。 (@Catfish_Man経由)

関連する問題