赞
踩
调用[receiver selector];
后,进行的流程:
编译阶段:[receiver selector];
方法被编译器转换为:
Objc_msgSend(receiver, selector)
--- 不带参数Objc_msdSend(receiver, selector, org1, org2, ...)
--- 带参数运行时阶段:消息接受者receiver
寻找对应的selector
receiver
的isa 指针
找到receiver
的Class (类)
;Class (类)
的cache (方法缓存)
的散列表中寻找对应的IMP (方法实现)
;cache (方法缓存)
中没有找到对应的IMP (方法实现)
的话,就继续在Class (类)
的method list (方法列表)
中找对应的selector
,如果找到,填充到cache (方法缓存)
中,并返回selector
;class (类)
中没有找到这个selector
,就继续在它的superclass (父类)
中寻找;selector
,直接执行receiver
对应的selector
方法实现的IMP (方法实现)
。selector
,Runtime
系统进入消息转发机制。运行时消息转发阶段:
+resolveInstanceMethod:
或者 +resolveClassMethod:
方法,利用class_addMethod
方法添加其他函数实现;forwardingTargetForSelector:
方法将消息的接受者转发给其他对象;nil
,则利用methodSignatureForSelector:
方法获取函数的参数和返回值类型。
methodSignatureForSelector:
返回了一个NSMethodSignature
对象(函数签名),Runtime
系统就会创建一个NSInvocation
对象,并通过forwardInvocation:
消息通知当前对象,给予此次消息发送最后一次寻找IMP
的机会。methodSignatureForSelector:
返回nil
。则Runtime
系统会发出doesNotRecognizeSelector:
消息,程序也就崩溃了。iOS底层探索 ---Runtime(一)--- 基础知识 - 简书
初始化有五种方法,主要掌握这两种区别。
timerWithTimeInterval和scheduledTimerWithTimeInterval的区别
scheduledTimerWithTimeInterval方法创建完timer之后,会自动以NSDefaultRunLoopModel模式加入运行循环。而timerWithTimeInterval方法创建的timer,不会自动加入运行循环,需要我们手动指定模式,并手动加入运行循环。因此,会导致一部分操作上得不同,
【点杀iOS】NSTimer的基本使用 - 杨鲁允浩 - 博客园
IOS NSTimer 定时器用法总结 - sirzhang - 博客园
void (^blockName)(void) = ^void (void) { // ... }; blockName();
void (^blockName)(void) = ^{ // ... }; blockName();
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。