isaの理解
2343 ワード
NSObjectでh中:isaは誰(どのクラス)を指すのか
Classの定義を再開するには、次の手順に従います.
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のファイルを表示します.
@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
unsigned int count;
Method * methods = class_copyMethodList(objc_getMetaClass("mangeiChild"), &count);
for (int i=0; i