runtime之消息机制

本文深入探讨了Objective-C中的消息发送机制,包括通过runtime的objc_msgSend()函数实现消息发送的过程,以及当方法未实现时如何进行消息转发。文中还提供了具体的代码示例和动态添加方法的步骤。
摘要由CSDN通过智能技术生成

文章主要写我对消息这块的了解。看了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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值