type
status
date
slug
summary
tags
category
icon
password
NSObject 对象拥有一个 isa 指针,isa 指针指向类本身
类本身可以理解为他元类的对象,他也拥有一些属性比如 isa 指针,方法列表,方法缓存列别,属性列表,父类、协议链表、ivars 等
根元类的 isa 指针指向根元类自己
[元类]是[元类的元类]的对象,直至找到根元类
[[Person alloc] init]; 方法,alloc 方法以 + 号开头为类方法,就是说明 Person 类本身是一个对象,对象调用自己的方法在 ivars 中添加一个成员变量
init 方法以 - 号开头,就是创建的 person 对象自己去初始化
[person sayHello]; 相当于调用了 ojbc_msgSend(obj, @selector(sayHello)) 进行消息转发
发送消息时,会根据 obj 的 isa 指针找到 Person 类本身,然后经历以下几个过程
1、在 Person 类本身的方法缓存列表 cache 中查找方法。如果有直接调用,流程结束,没有进行下一步
2、在 Person 类本身的方法列表 methodLists 中查找方法。如果有直接调用,流程结束,没有进行下一步(父类的方法列表也会被拷贝到该列表)
3、去父类的 methodLists 中查找方法,直至找到根父类。如果有直接调用,流程结束,没有进行下一步
4、到这里开始进行动态消息转发
4.1、Method resolution
4.2、Fast forwarding (方法转发)
4.3、Normal forwarding
首先会调用- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector 方法,倘若返回值为nil,则runtime会发出doesNotRecognizeSelector:消息,引发异常,程序崩溃。
如果返回了一个合理的函数签名,Runtime就会创建一个NSInvocation对象并发送-forwardInvocation:消息给目标对象。
补充:以上每一步,如果找到了方法并进行了调用,会把找到的方法加入 cache 中,下次调用直接从 cache 中取出方法
- 作者:NotionNext
- 链接:https://tangly1024.com/article/OC%20%E7%9A%84%E6%B6%88%E6%81%AF%E8%BD%AC%E5%8F%91
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章