runtime之消息机制

文章主要写我对消息这块的了解。看了Hank老师的视频讲解以及网上很多博客的资料。根据自己的理解写了这篇文章。

首先,我们来了解一下消息发送机制,<objc/message.h>


是通过runtime的objc_msgSend()来实现的

首先我们创建一个Person类,在这个类里声明并实现eat方法。

person.h

runtime之消息机制

person.m

runtime之消息机制


正常情况下,我们都是这样实现的

Person * p = [[Person alloc] init];

[p eat];

现在我们通过runtime的消息发送来实现。

Person * p = [[Person alloc] init];

objc_msgSend(p, @selector(eat));

最后全部转化为runtime语言就是

Person * p = objc_msgSend(objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init"));

    

objc_msgSend(p, sel_registerName("eat"));

runtime之消息机制


当系统去调用eat方法的时候,回去找Person里面这个方法有没有实现。上面就是Person里实现了这个方法的时候。

消息转发

当没有实现的时候eat方法的时候,会报错崩溃。这个时候就会走消息转发


runtime之消息机制runtime之消息机制

首先会调用下面这两个方法。

//当调用了一个没有实现的类方法

+(BOOL)resolveClassMethod:(SEL)sel

{

    return [super resolveClassMethod:sel];

}

//当调用了一个没有实现的实例方法

+(BOOL)resolveInstanceMethod:(SEL)sel

{

    return [super resolveInstanceMethod:sel];

}


这个时候你可以在这两个方法里面动态的添加方法。

因为eat是实例方法,所以,我们走下面的这个方法

runtime之消息机制

看,动态的添加了eat方法后,就走了我们实现eat函数。

如果,你没有在这两个方法里面动态添加方法的话,会继续走下面的方法。

runtime之消息机制

runtime之消息机制

runtime之消息机制

这就是整套的消息转发。网上有很多图解。我下了一个,更能方便理解。

runtime之消息机制


看了一下几篇博客

http://www.cocoachina.com/ios/20150604/12013.html

http://www.cnblogs.com/ansyxpf/p/5690215.html