Runtime系列(消息转发)
来源:互联网 发布:warframe 知乎 编辑:程序博客网 时间:2024/06/08 17:01
原文来自:http://www.jianshu.com/p/4f211020de05前言
一个方法的声明必定会有与之对应的实现,如果调用了只有声明没有实现的方法会导致程序crash,而实现并非只有中规中矩的在.m里写上相同的方法名再在内部写实现代码。
正文
先来回顾一下引文中的部分内容:
当调用[receiver message]
时,会触发id objc_msgSend(id self, SEL op, ...)
这个函数。
receiver通过isa指针找到当前对象的class,并在class中寻找op,如果找到,调用op,如果没找到,到super_class中继续寻找,如此循环直到NSObject(引自引文)。
如果NSObject中仍然没找到,程序并不会立即crash,而是按照优先级执行下列三个方法(下列方法优先级依次递减,高优先级方法消息转发成功不会再执行低优先级方法):
1.+ resolveInstanceMethod:(SEL)sel // 对应实例方法 + resolveClassMethod:(SEL)sel // 对应类方法2.- (id)forwardingTargetForSelector:(SEL)aSelector3.- (void)forwardInvocation:(NSInvocation *)anInvocation
举例
比如在ViewController.h中声明,并且不在ViewController.m中直接实现,如何确保程序正常运行
@interface ViewController : UIViewController- (void)sayHello:(NSString *)name;@end
resolveInstanceMethod:
以实例方法为例:
说一下这个函数
class_addMethod(<#__unsafe_unretained Class cls#>, <#SEL name#>, <#IMP imp#>, <#const char *types#>)
cls
表示要添加方法的类,name
表示要添加方法的SEL
,imp
表示要添加方法的IMP
,types
表要添加方法的返回值和参数类型。
上篇文章已经说过SEL
和IMP
的异同,也许你会想这里的name
和imp
参数是否重复,毕竟receiver
已经明确,无论通过SEL
还是IMP
都是可以找到对应函数\方法的。正常情况是这样,但是这里只有声明没有常规的实现,如果只有SEL
会导致找不到入口,如果只有IMP
会导致函数\方法名不确定。
示例中type
的值为v@:@
,如果不用imp_implementationWithBlock
来写可能更好理解
v@:@
中:v
对应着返回值void
,第一个@
对应着第一个参数类型id
,:
对应着第二个参数类型SEL
,第二个@
对应着三个参数类型NSString
关于Type Encodings可参考官方文档
forwardingTargetForSelector:
将ViewController中调用的实例方法转移到Message中,这里很好理解无须赘述。
forwardInvocation:
同样,这里是将ViewController中调用的实例方法转移到Message中,只是多了一层NSInvocation
包装,有利于我们做更多的事情。
- Runtime系列(消息转发)
- runtime浅谈(三)消息转发
- runtime(三)应用 消息转发
- Runtime之消息转发
- iOS runtime 消息转发
- runtime基础、消息转发
- Runtime消息转发机制
- Runtime消息转发机制
- runtime系列4&5---Message Forwarding-消息转发&类型编码
- iOS runtime 之消息转发
- runTime 的消息转发机制
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- Objective-C runtime之消息转发机制(三)
- 跳转到AppStore中应用页面
- ViewPager圆点导航动态实现(利用seletor)
- 极光推送JPush相关设置
- PTAM学习笔记(一)---PTAM在windows上的编译
- PHP学习之挖掘细节提升网站性能
- Runtime系列(消息转发)
- 超有爱的并查集
- 【数据结构与算法学习笔记】PART3 线性结构(除向量外,数组、栈、队列、链表)
- placehoder点击文字消失
- Android单排上王者系列之FFmpeg移植Android编译生成单个库
- 分析关键呈现路径性能
- 梯度下降三种形式
- Android Studio如何设置代码自动提示
- ANDROID application详解与用法