iOS个人总结
1. iOS消息转发的实现
消息转发的主要过程如下:
当向一个对象发送一个消息,首先会在这个类及其父类的该死列表中查找该方法的实现,如果不能查找到该方向的实现,则进入动态方法解析的过程,这个过程将会调用resolveInstanceMethod,这个方法将会给类使用objc_addMethod动态添加方法的机会,如果运行时(Runtime)找到对应用SEL的IML实现,则调用,否则将进入下一个阶段,即快速转发阶段,使用
- (id)forwardingTargetForSelector:(SEL)aSelector
流程到了这里,系统给了个将这个SEL转给其他对象的机会。
返回参数是一个对象,如果这个对象非nil、非self的话,系统会将运行的消息转发给这个对象执行。否则,继续查找其他流程。
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
这个函数和后面的forwardInvocation:是最后一个寻找IML的机会。这个函数让重载方有机会抛出一个函数的签名,再由后面的forwardInvocation:去执行。
- (void)forwardInvocation:(NSInvocation *)anInvocation
真正执行从methodSignatureForSelector:返回的NSMethodSignature。在这个函数里可以将NSInvocation多次转发到多个对象中,这也是这种方式灵活的地方。(forwardingTargetForSelector只能以Selector的形式转向一个对象)
2. RunLoop的实现
RunLoop的实现简单来说就是在线程中实现了一个do-while的的死循环,不断接收用户输入,在内部接收及分发相应的事件
function loop() {
initialize();
do {
var message = get_next_message();
process_message(message);
} while (message != quit);
}