2012-01-13 8 views
2

runtime.hの中を見ると、構造体objc_classの定義が見つかりました。様々なメンバーの中で構造体objc_classのmethodLists属性は何ですか?

、我々はこれを持っている: -

構造体objc_method_listは** methodLists

我々は間違いなく、クラスが持っているものすべてのメソッド を知っておく必要があります。しかしメソッドのリストは問題ないはずです、なぜ "リスト"があるのでしょうか?

1つのリストだけではないのはなぜですか?

また、誰でも指定することができます。メソッドは、そのリストのスーパークラス部分から継承されるか、親クラスの構造を指すスーパークラスポインタを介してメソッドに渡されます。

+0

私は[ソース](http://opensource.apple.com/tarballs/objc4/objc4-493.11.tar.gz)でしか見たことはありませんが、実装の詳細([objc-class.m'(http://opensource.apple.com/source/objc4/objc4-493.11/runtime/objc-class.m)のコメントを参照してください)。 –

答えて

1

ゲオルグによって連結されたような目的は、objc-class.mで説明されている:

  1. NULL:

    cls-> methodListsは三つの形式のいずれかであることができるクラスにはメソッドがありません。

  2. NULLでなく、CLS_NO_METHOD_ARRAYが設定されています。cls-> methodLists は、クラスの唯一のメソッドリストである1つのメソッドリストにポイントします。
  3. NULLでなく、CLS_NO_METHOD_ARRAYでクリアされます。cls-> methodListsは、メソッドリストポインタの配列 を指します。配列のブロック の終わりは-1に設定されます。メソッドリストの実際の数がそれより小さい場合は、配列の残りの部分はNULLです。

カテゴリを追加してクラスを追加したり削除したりすると、クラスリストの形式が変更されることがあります。 さらに、個々のメソッドリスト は、修正するときに再割り当てすることができます。

クラスは、最初は#1または#2として読み込まれます。カテゴリに などが追加されている場合は、クラスが#3に変更されます。フォーム#3に入ると、 メソッドは削除されても、クラスは決して#1または#2に格下げされません。 objc_addClassで追加されたクラスは、最初は#1または#3のいずれかです。

したがって、短い回答は「カテゴリのため」です。カテゴリが挿入されると、そのメソッドリストを既存の既存のリストと組み合わせようとするのではなく、単に新しいエントリがmethodListsに追加され、そのカテゴリから来るリストに設定されます。これはおそらく(潜在的な)大規模な再割り当てやコピーを避けるため、カテゴリの注入を高速にします。ここで

3

構造体objc_method_list ** methodListsに私の詳細調査です:http://blog.csdn.net/jasonblog/article/details/7303618

、デフォルトでインスタンスメソッドの短い、methodLists店SEL-IMPマッピングインチこの状況では、リストは1つしかありません。

「methodLists」という名前は、複数のリストを含むことができます。クラスにカテゴリを追加すると、ランタイムシステムは、カテゴリのメソッドリストを指すメソッドリストにもう1つのリストを挿入します。

私はこの質問に数か月前に答えようとしましたが、その時点ではネットワーク問題のために私の答えを捨てました。今私は再びそれを満たす:)

関連する問題