美文网首页
isa的理解

isa的理解

作者: 面朝对象_春暖花开 | 来源:发表于2016-12-30 11:02 被阅读20次

    在NSObject.h里面: isa就是指向谁(哪个类)

    @interface NSObject <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 的两种类型:
    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;

    <h1>按钮触发其他类里面的类方法

    <h5>objc_getMetaClass//元类
    objc_getClass//类
    class_getSuperclass//父类,三个方法参数为''char''返回值Class,忘记的话查看class的文件.

    unsigned int count;
        Method * methods = class_copyMethodList(objc_getMetaClass("mangeiChild"), &count);
        for (int i=0; i<count; i++) {
            Method method = methods[i];
            selector = method_getName(method); 
        }
        [self.btn addTarget:[mangeiChild class] action:selector forControlEvents:UIControlEventTouchUpInside];
    

    相关文章

      网友评论

          本文标题:isa的理解

          本文链接:https://www.haomeiwen.com/subject/swkmvttx.html