OC对象的本质

~ 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对象的本质)