美文网首页
OC对象的本质

OC对象的本质

作者: 求长生 | 来源:发表于2020-06-14 21:14 被阅读0次

    ~ Objective-C代码,底层实现?
    Objective-C底层实现是C\C++代码,C\C++代码转换成汇编语言,汇编语言转成机器语言。

    ~ Objective-C的对象、类主要是基于C\C++的什么数据结构实现的?
    结构体。

    ~ 将Objective-C代码转换为C\C++代码?
    xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件。

    ~ NSObject的底层实现
    在底层实现里面转换成C\C++代码后,NSObject是一个结构体,所有的对象都包含一个类型为 isa 的指针。

    ~ 一个NSObject对象占用多少内存?
    一个NSObject对象系统分配16个字节(通过malloc_size函数获得),但NSObject对象内部只使用了8个字节。(64bit环境下,可以通过class_getInstanceSize函数获得)

    ~ 对象的isa指针指向哪里?
    实例对象(instance)的isa指向class对象。
    class对象的isa指向meta-class对象。
    meta-class对象的isa指向基类的meta-class对象。

    ~ OC的类信息存放在哪里?
    对象方法、属性、成员变量、协议信息,存放在class对象中。
    类方法,存放在meta-class对象中。
    成员变量的具体值,存放在instance对象。

    ~ OC的消息机制
    OC中的方法调用其实都是转成了objc_msgSend函数的调用,给消息调用者(receiver)发送一条消息(selector方法名)

    ~objc_msgSend底层3阶段
    消息发送(当前类,父类中查找)、动态方法解析、消息转发

    ~ objc_msgSend的消息发送
    1、判断接收者(receiver)是否为nil,为nil则退出,不为nil从接受者类(receiverClass)的缓存(cache)里找。如果找到则调用方法结束查找。
    2、如果没有找到,从receiverClass的class_rw_t中查找方法,找到就调用方法并将方法缓存到receiverClass的cache中。
    3、否则,从superClass中cache里找,如果没有则从superClass的class_rw_t中查找方法。
    4、没有找到,上层是否还有superClass,没有则动态方法解析。

    ~ objc_msgSend动态方法解析
    1、是否曾经有动态解析,曾经有过,则跳转消息转发。
    2、没有则调用+resolveInstanceMethod:(解析实例方法)或者+resolveClassMethod:(解析类方法)方法来动态解析方法。
    3、标记为已经动态解析
    4、动态解析过后,会重新走“消息发送”的流程,从receiverClass的cache中查找这一步开始走。

    ~objc_msgSend消息转发
    1、调用forwardingTargetForSelector:方法,返回不是nil则调用objc_msgSend(返回值,sel)。
    2、为nil,调用methodSignatureForSelector:方法(Signature签名),返回不为nil则调用forwardInvocation:方法。(开发者可以在forwardInvocation:方法中自定义任何逻辑)
    3、返回nil,调用doesNotRecognizeSelector:方法。
    以上方法都有对象方法、类方法2个版本(前面可以是加号+,也可以是减号-)

    ~ NSObject的底层实现

    NSObject1.png NSObject2.png NSObject3.png

    NSObject底层实现

    https://www.jianshu.com/p/49947a53c4ed

    [NSObject、NSArray、NSMutableArray和NSString]
    (https://book.2cto.com/201210/6153.html)

    从 NSObject 的初始化了解 isa

    相关文章

      网友评论

          本文标题:OC对象的本质

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