カテゴリをプログラマとして使用する方法はわかっていますが、どのように実装されているのか不思議です。コンパイラは、静的初期化子からclass_replaceMethodへの呼び出しにそれらをコンパイルしますか?ありがとう。Objective Cではカテゴリはどのように実装されていますか?
答えて
トピックに関する新しい回答。
各クラスにはメソッドリストがあり、メソッドルックアップを実行するときにメソッドリストが最初から最後までスキャンされます。メソッドが見つからない場合、スーパークラスのリストは、ルートクラスに達するまでスキャンされます。発見されたメソッドは、次回の検索の高速化のためにキャッシュされます。
カテゴリにクラスをロードするとき、カテゴリメソッドリストはが既存のリストに先行してとなり、キャッシュがフラッシュされます。リストは順番に検索されるので、次の検索で元のメソッドの前にカテゴリメソッドがであることがわかります。
このカテゴリの設定は、クラスに初めてアクセスするときに静的データから遅延して行われます。また、バンドルを実行可能コードでロードすると再実行できます。
要するに、それはclass_replaceMethod()
より少し低いレベルです。
カテゴリには特別なの実装がありませんが、実際には実装上無効です。
プロトコルは、実行時にクラスのマーカーとして機能します。 class_copyProtocolList()
を使用すると、クラスが実行時に準拠しているプロトコルのリストを取得できます。プロトコルが準拠するプロトコルを取得する機能は、兄弟protocol_copyProtocolList()
です。
これらのメソッドは、この特定のクラスまたはプロトコルのプロトコルの一覧のみを返すことに注意してください。スーパークラスや他のプロトコルからの参照ではありません。つまり、実行時の実際のルックアップは高価になります。代わりにclass_conformsToProtocol()
(またはprotocol_conformsToProtocol()
)を使用して、適合性を問い合わせると、これらのメソッドは結果をキャッシュできます。
実行時に適合性を照会することはめったに良い考えではありません。プロトコルの適合性は、開発者がこれらの警告を無視することを選択した場合、コンパイラによる警告で検証されます。
なぜプロトコルについて話していますか?彼らはカテゴリとはまったく異なった構成要素ですか? –
@Joshua Weinberg - 真実、私は自分自身のお尻を作りました。私は質問がプロトコルであることを100%確信していました。うん、右の文脈で私は私の答えが好きだっただろう。 – PeyloW
どのように動作しているか知りたいことがあれば、ここから見つけることができます。
http://opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-runtime-new.mm
ランタイムは、完全にオープンソースです。
ありがとう、それは役に立ちました。私は複数の回答を受け入れることができたらいいと思いますので、あなたのコメントをアップアップするだけで解決します。 –
- 1. @privateはどのように実装されていますか?
- 2. String.LengthはC#でどのように実装されていますか?
- 3. C#4でメメントパターンはどのように実装されていますか?
- 4. BigDecimalはどのように実装されていますか?
- 5. MarshalByRefObjectはどのように実装されていますか?
- 6. \ bはどのように実装されていますか?
- 7. getchar()はどのように実装されていますか?
- 8. フィルタはどのように実装されていますか?
- 9. タスクスケジューリングはどのように実装されていますか?
- 10. HttpSessionはどのように実装されていますか?
- 11. プロトコルはどのように内部実装されていますか?
- 12. 保持カウントはNSObjectでどのように実装されていますか?
- 13. カテゴリは、プライマリクラスによって実装されるメソッドを実装している原因は何ですか?
- 14. データベーステンプレートライブラリ(C++)でvariant_rowがどのように実装されていますか?
- 15. Wami Recorderは実際にどのように実装されていますか?
- 16. MPI_SendはどのようにMPI_Characterで実装されていますか? FORTRANで
- 17. Objective-cの "__block"キーワードはどのように使用されていますか?
- 18. Collection.sortがどのように実装されていますか?
- 19. WindowsでPythonマルチプロセッシングはどのように実装されていますか?
- 20. SQLデータベースエンジン内でデータベーストリガはどのように実装されていますか?
- 21. OSレベルでスリープはどのように実装されていますか?
- 22. pthreadはLinuxカーネル3.2でどのように実装されていますか?
- 23. Surface SDKではジェスチャがどのように実装されていますか?
- 24. Pythonでレンジタイターはどのように実装されていますか?
- 25. string.findはCPythonでどのように実装されていますか?
- 26. Linuxカーネルでpercpuポインタはどのように実装されていますか?
- 27. 動的バインディングはどのようにJavaで実装されていますか?
- 28. ニューラルネットワークはOpenCvでどのように実装されていますか?
- 29. コルーチンはsmalltalkでどのように実装されていますか?
- 30. データベーステーブルはMySQLでどのように実装されていますか?
ありがとう、それを得ました。 –
初めてカテゴリを使用する前にカテゴリを「初期化」するのに適した場所はありますか? '+ initialize'を試みましたが、カテゴリクラスが最初に呼び出されるとすぐに呼び出されるように見えるので、カテゴリを初期化する必要はなく、もっと重要なことは無限ループにつながる可能性があります。 – Rivera