isaの理解

2343 ワード

NSObjectでh中:isaは誰(どのクラス)を指すのか
@interface NSObject  {
    Class isa  OBJC_ISA_AVAILABILITY;
}

Classの定義を再開するには、次の手順に従います.
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif
}

1,[child class]を呼び出すと,childはisaポインタを介してChildのclassを見つける.2,[child superclass]を呼び出すと,childはisaを介してChildのclassを見つけ,super_class、Parentのclassを見つけます.ここで、objc_を再普及classの2つのタイプ:class:インスタンスオブジェクト(child、Child)のisaが指す構造体;
metaclass:classのisaが指す構造体;3,次に[child SelectorC]を呼び出し,childはisaを介してChildのclassを見つけ,class(上struct objc_classの定義を参照)のメソッドリストにSelectorCを見つける.4、もう一度[child SelectorP]を呼び出してみて、childはisaを通じてChildのclassを見つけて、classの中にこの方法がないことを発見して、classの中のsuper_を通じてclassはParentのclassを見つけて、中の方法のリストでSelectorPを見つけました;5,さらにクラスメソッド[Child ClassSelectorC],Child(注意,大文字)isaでChildのclassを見つけ,classのisaでChildのmetaclassを見つけ,metaclassのメソッドリストでClassSelectorCを見つけた.6,再度[Child ClassSelectorP]を呼び出してみて、Childはisaを通じてChildのclassを見つけて、classのisaを通じてChildのmetaclassを見つけて、metaclassの中でこの方法がないことを発見して、metaclassの中のsuper_を通じてclassはParentのmetaclassを見つけて、中の方法のリストでClassSelectorPを見つけました;

ボタンを押すと、他のクラスのクラスメソッドがトリガーされます。

objc_getMetaClass//メタクラスobjc_getClass//クラスclass_getSuperclass//親、3つのメソッドパラメータは''char'戻り値Classで、忘れたらclassのファイルを表示します.
unsigned int count;
    Method * methods = class_copyMethodList(objc_getMetaClass("mangeiChild"), &count);
    for (int i=0; i