我们调用方法的时候,其实就是在发送消息,那这个消息发送的流程是什么样子的呢。
复习isa指针
首先,复习isa指针。
- 创建对象时,分配内存的同时,isa指针也随之创建;
- 发送消息时(执行方法时),isa指向谁,就在谁的方法列表里面查找要执行的方法;
- 发送消息给一个对象时,isa指针指向这个对象所属的类,会在所属类和父类的方法列表里面查找要执行的方法;
- 发送消息给一个类时,isa指针指向这个类的元类,元类里面包含了所有的类方法。就会在元类(meta-class)的方法列表里面查找要执行的方法。
eg:[NSArray array];就是在给NSArray发送消息,在NSArray的元类里面查找要执行的方法。 - 发送消息给一个元类(meta-class),所有元类的isa指针都指向NSObject(基类)的元类,而NSObject的isa指针指向自己。形成了一个闭环。
流程
调用方法/发送消息,就是调用
objc_msgSend(receiver, selector, arg1, arg2, ...)
// receiver:消息接受者
// selector:调用的方法
// arg:参数
方法被调用后,会被放到缓存里面,下次再调用该方法的时候直接从缓存里面读取,提高效率。首先我们看存缓存读取的流程:
当方法已放入缓存
从缓存读取方法当方法未放入缓存
从所在类读取方法总结:
objc_sendMsg发送消息流程:
1、根据接收对象的isa指针,找到接收对象所在类的方法缓存。
2、从方法缓存里面查看是否有要执行的这个方法,有则从缓存读取该方法进行执行。
3、缓存里面没有,就根据isa指针找到所属类对应的方法列表,从方法列表里面找到对应的实现。实现后把方法加入缓存。
4、如果对应类的方法列表也没有找到,就从父类里面的方法列表查找,可一直找到基类里面看是否有该方法可以实现。
如果一直未找到方法的实现,就会进行消息转发,下一篇文章就来记录如何进行的消息转发。
网友评论