文章主要写我对消息这块的了解。看了Hank老师的视频讲解以及网上很多博客的资料。根据自己的理解写了这篇文章。
首先,我们来了解一下消息发送机制,<objc/message.h>
是通过runtime的objc_msgSend()来实现的。
首先我们创建一个Person类,在这个类里声明并实现eat方法。
person.h
person.m
正常情况下,我们都是这样实现的
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"));
当系统去调用eat方法的时候,回去找Person里面这个方法有没有实现。上面就是Person里实现了这个方法的时候。
消息转发
当没有实现的时候eat方法的时候,会报错崩溃。这个时候就会走消息转发
首先会调用下面这两个方法。
//当调用了一个没有实现的类方法
+(BOOL)resolveClassMethod:(SEL)sel
{
return [super resolveClassMethod:sel];
}
//当调用了一个没有实现的实例方法
+(BOOL)resolveInstanceMethod:(SEL)sel
{
return [super resolveInstanceMethod:sel];
}
这个时候你可以在这两个方法里面动态的添加方法。
因为eat是实例方法,所以,我们走下面的这个方法
看,动态的添加了eat方法后,就走了我们实现eat函数。
如果,你没有在这两个方法里面动态添加方法的话,会继续走下面的方法。
这就是整套的消息转发。网上有很多图解。我下了一个,更能方便理解。
看了一下几篇博客
http://www.cocoachina.com/ios/20150604/12013.html
http://www.cnblogs.com/ansyxpf/p/5690215.html