美文网首页日常
iOS底层学习3 -- oc底层方法调用

iOS底层学习3 -- oc底层方法调用

作者: 恋空K | 来源:发表于2020-04-27 00:05 被阅读0次





    调用类方法的时候,如果在基类的元类对象里面都没找到对应的类方法现实,就会通过基类的元类对象的superclass指针找到基类的类对象,如果基类的类对象中也没有对应的同名的方法现实,就会报找不到方法的错。不会继续调用基类的superclass指针继续寻找方法的原因是,因为基类的superclass指针为nil


    printf函数族中对于%p(内存地址)一般以十六进制整数方式输出指针的值,附加前缀0x,

    oc调用方法的本质是发消息
    比如:[Person test] 大致相当于 ---> objc_msgSend([Person class], @selector(test));
    [NSObject test] 大致相当于 ---> objc_msgSend([NSObject class], @selector(test));
    所以最终转成的代码只知道,我给Person这个类或者NSObject这个类发送一条test消息,
    但是并没有告诉Person这个类或者NSObject这个类,我给它发送的方法是+开头的方法还是--号开头的方法
    所以我们oc调用方法的本质是,它是不会去区分是对象方法还是类方法的,不管是对象方法还是类方法,最终都是通过方法名去找的,所以不知道你调用的这个方法是加号开头的还是减号开头的
    总结,person调用test方法,本质就是给person发送了一条test消息



    typedef struct objc_class *Class; Class是一个指向结构体的指针(struct objc_class这个对象的指针)



    有上图可知,superClass直接指向父类类对象的地址
    c++的结构体是可以继承的比如:struct objc_class : objc_object {}也可以说c++的结构体跟类几乎没区别。也就是struct objc_class : objc_object可以看成是@interface objc_class : objc_object





    相关文章

      网友评论

        本文标题:iOS底层学习3 -- oc底层方法调用

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