2011-08-11 14 views

答えて

8

トピックに関する新しい回答。

各クラスにはメソッドリストがあり、メソッドルックアップを実行するときにメソッドリストが最初から最後までスキャンされます。メソッドが見つからない場合、スーパークラスのリストは、ルートクラスに達するまでスキャンされます。発見されたメソッドは、次回の検索の高速化のためにキャッシュされます。

カテゴリにクラスをロードするとき、カテゴリメソッドリストはが既存のリストに先行してとなり、キャッシュがフラッシュされます。リストは順番に検索されるので、次の検索で元のメソッドの前にカテゴリメソッドがであることがわかります。

このカテゴリの設定は、クラスに初めてアクセスするときに静的データから遅延して行われます。また、バンドルを実行可能コードでロードすると再実行できます。

要するに、それはclass_replaceMethod()より少し低いレベルです。

+0

ありがとう、それを得ました。 –

+0

初めてカテゴリを使用する前にカテゴリを「初期化」するのに適した場所はありますか? '+ initialize'を試みましたが、カテゴリクラスが最初に呼び出されるとすぐに呼び出されるように見えるので、カテゴリを初期化する必要はなく、もっと重要なことは無限ループにつながる可能性があります。 – Rivera

0

カテゴリには特別なの実装がありませんが、実際には実装上無効です。

プロトコルは、実行時にクラスのマーカーとして機能します。 class_copyProtocolList()を使用すると、クラスが実行時に準拠しているプロトコルのリストを取得できます。プロトコルが準拠するプロトコルを取得する機能は、兄弟protocol_copyProtocolList()です。

これらのメソッドは、この特定のクラスまたはプロトコルのプロトコルの一覧のみを返すことに注意してください。スーパークラスや他のプロトコルからの参照ではありません。つまり、実行時の実際のルックアップは高価になります。代わりにclass_conformsToProtocol()(またはprotocol_conformsToProtocol()を使用して、適合性を問い合わせると、これらのメソッドは結果をキャッシュできます。

実行時に適合性を照会することはめったに良い考えではありません。プロトコルの適合性は、開発者がこれらの警告を無視することを選択した場合、コンパイラによる警告で検証されます。

+0

なぜプロトコルについて話していますか?彼らはカテゴリとはまったく異なった構成要素ですか? –

+0

@Joshua Weinberg - 真実、私は自分自身のお尻を作りました。私は質問がプロトコルであることを100%確信していました。うん、右の文脈で私は私の答えが好きだっただろう。 – PeyloW

3

どのように動作しているか知りたいことがあれば、ここから見つけることができます。

http://opensource.apple.com/source/objc4/objc4-493.9/runtime/objc-runtime-new.mm

ランタイムは、完全にオープンソースです。

+0

ありがとう、それは役に立ちました。私は複数の回答を受け入れることができたらいいと思いますので、あなたのコメントをアップアップするだけで解決します。 –

関連する問題