
iOS_Runtime5_消息转发
发布日期:2021-05-10 10:09:17
浏览次数:16
分类:精选文章
本文共 1617 字,大约阅读时间需要 5 分钟。
- 当消息接受者,未找到对应的方法实现的时候,经过一系列的方法跳转,可以让消息接受者调用其他的已实现的方法,也可以改变消息接受者,以及消息接受者调用的方法。
- 代码示例(最终改变消息接受者,以及调用的方法):
// TestDeliverNews.h#import@interface TestDeliverNews : NSObject- (void)clearNews;@end// TestDeliverNews.m#import "TestDeliverNews.h"#import #import "Person.h"/* 调用未实现的方法,进行消息转发 */@implementation TestDeliverNews// 方法一+ (BOOL)resolveInstanceMethod:(SEL)sel{ // 消息接收者没有找到对应的方法实现的时候,会先调用此方法,可在此方法实现中动态添加新的方法 // 返回YES表示相应selector的实现已经被找到,或者添加新方法到了类中,否则返回NO return YES;}// 方法二- (id)forwardingTargetForSelector:(SEL)aSelector { // 如果方法一的返回NO,或者直接返回了YES,而没有添加方法,该方法将会被调用 // 在这个方法中,我们可以指定一个对象作为返回值,而返回的对象可以响应(aSelector)方法 // 注意如果返回self就会死循环 return nil;}// 方法三- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector { // 如果方法二的返回值为nil,则此方法(方法三)会被调用,系统会询问我们要一个合法的『类型编码(Type Encoding)』 // 如果该方法返回 nil,则不会进入下一步,而是无法处理消息 return [NSMethodSignature signatureWithObjCTypes:"v@:"];}// 方法四(1)// 在这里进行消息转发// 当方法四(1)被实现之后,方法四(2)将不会被调用- (void)forwardInvocation:(NSInvocation *)anInvocation { // 在这里可以改变方法选择器 [anInvocation setSelector:@selector(sayHello)]; // 改变方法选择器后,需要指定消息的接收者 // 这里指定Person的对象为消息的接受者 Person *per = objc_msgSend(objc_msgSend(objc_getClass("Person"), sel_registerName("alloc")), sel_registerName("init")); [anInvocation invokeWithTarget:per]; // 注意:anInvocation需要先改变方法选择器,然后再指定消息的接受者}// 方法四(2)// 如果没有实现消息转发方法:方法四(1) ,则调用此方法- (void)doesNotRecognizeSelector:(SEL)aSelector { NSLog(@"unresolved method :%@", NSStringFromSelector(aSelector));}
调用示例:
TestDeliverNews *test = [[TestDeliverNews alloc]init];[test clearNews];
代码地址:
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月23日 13时25分41秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
配置php.ini文件,关闭错误提示,打开错误日志,设置错误日志路径
2021-05-10
接收get或post数据使用fwrite写入文件中,方便追踪错误;或其他几种缓存方式
2021-05-10
mysql开启慢查询日志及查询
2021-05-10
Window平台Grpc框架搭建
2021-05-10
C中几道位运算的例题
2021-05-10
python入门(二)基础知识
2021-05-10
golang log4go 使用说明及丢失日志原因
2021-05-10
Android Studio打包生成Jar包的方法
2021-05-10
Excel 如何根据单元格中的值设立不同的颜色(或渐变)?(222)
2021-05-10
python 文件操作 open()与with open() as的区别(打开文件)
2021-05-10
python中列表 元组 字典 集合的区别
2021-05-10
python struct 官方文档
2021-05-10
Docker镜像加速
2021-05-10
Unity3D的InputField输入框控件按下Tab键光标自动切换
2021-05-10
静态数组类的封装(泛型)
2021-05-10
操作记录-2021-03-15: sunxiaoyu_project
2021-05-10