ゲオルグによって連結されたような目的は、objc-class.mで説明されている:
- NULL:
cls-> methodListsは三つの形式のいずれかであることができるクラスにはメソッドがありません。
- NULLでなく、CLS_NO_METHOD_ARRAYが設定されています。cls-> methodLists は、クラスの唯一のメソッドリストである1つのメソッドリストにポイントします。
- NULLでなく、CLS_NO_METHOD_ARRAYでクリアされます。cls-> methodListsは、メソッドリストポインタの配列 を指します。配列のブロック の終わりは-1に設定されます。メソッドリストの実際の数がそれより小さい場合は、配列の残りの部分はNULLです。
カテゴリを追加してクラスを追加したり削除したりすると、クラスリストの形式が変更されることがあります。 さらに、個々のメソッドリスト は、修正するときに再割り当てすることができます。
クラスは、最初は#1または#2として読み込まれます。カテゴリに などが追加されている場合は、クラスが#3に変更されます。フォーム#3に入ると、 メソッドは削除されても、クラスは決して#1または#2に格下げされません。 objc_addClassで追加されたクラスは、最初は#1または#3のいずれかです。
したがって、短い回答は「カテゴリのため」です。カテゴリが挿入されると、そのメソッドリストを既存の既存のリストと組み合わせようとするのではなく、単に新しいエントリがmethodLists
に追加され、そのカテゴリから来るリストに設定されます。これはおそらく(潜在的な)大規模な再割り当てやコピーを避けるため、カテゴリの注入を高速にします。ここで
私は[ソース](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)のコメントを参照してください)。 –