Categoryで分類して元のクラスを上書きする方法

1304 ワード

現象:
1、分類中の方法は元のクラスの方法の2、複数の分類の中の同じ方法を上書きし、コンパイルの順序に従って、最後のコンパイルの分類中の方法を実行する
げんり
Categoryに対応する構造体を分類することができます.mファイルをc++ファイルに変換する:xcrun-sdk iphoneos clang-arch arm 64-rewrite-objc LZPerson+text.mは対応するものを生成することができる.cppファイル;はい.cppファイルでCategoryを検索tはCategoryに対応する構造体を見ることができる:
struct _category_t {
const char *name;
struct _class_t *cls;
const struct _method_list_t *instance_methods;
const struct _method_list_t *class_methods;
const struct _protocol_list_t *protocols;
const struct _prop_list_t *properties;
};

構造体を観察すると,分類に対応する構造体には,インスタンスメソッドを格納するリスト,クラスメソッドを格納するリスト,プロトコルを格納するリスト,属性のリストがあることが分かった.
だから
  • 分類は、一般に、既存のクラスに対して動的に新しい方法を拡張するために使用される.
  • 分類には、インスタンスメソッド、クラスメソッド、属性、プロトコルを追加できます.ただし、メンバー変数は追加できません.
  • 属性を追加するとset,getメソッドの宣言のみが生成され、アンダースコアメンバー変数も生成されません.

  • 分類上書き理由
    システムは、実行時に分類に対応するインスタンスメソッド、クラスメソッドなどを元のクラスまたはメタクラスのメソッドリストに挿入し、リストの前にあります.したがって,メソッド呼び出し時にisaで対応するクラスやメタクラスのリストから対応するメソッドを検索する際に先に調べられるのは分類中のメソッドである.調べたら直接呼び出して検索を続行しません.これが「カバー」の本質だ!
    複数の分類が存在し、誰を呼び出しますか?
    これはコンパイル順序に関係しており,最後にコンパイルした分類で対応する情報はクラスまたはメタクラス対応リストの一番前に統合される.だから最後にコンパイルした分類を呼び出す方法です!Build Phases->Complie Sourceのコンパイル順序を表示できます.
    参考資料:https://www.jianshu.com/p/dd57c39a5e4c https://tech.meituan.com/2015/03/03/diveintocategory.html