- runtime
- nstimer
- block
- 多线程
- uiview和calayer
- 属性词
- 响应链
- kvo和kvc
- sdwebimage 图片渲染过程
- 性能优化 内存管理
- 数据存储
- 设计模式
- 网络层socket和http区别
- 响应式编程
1.runtime
调用[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(一)--- 基础知识 - 简书
2.NSTimer
初始化有五种方法,主要掌握这两种区别。
timerWithTimeInterval和scheduledTimerWithTimeInterval的区别
scheduledTimerWithTimeInterval方法创建完timer之后,会自动以NSDefaultRunLoopModel模式加入运行循环。而timerWithTimeInterval方法创建的timer,不会自动加入运行循环,需要我们手动指定模式,并手动加入运行循环。因此,会导致一部分操作上得不同,
【点杀iOS】NSTimer的基本使用 - 杨鲁允浩 - 博客园
IOS NSTimer 定时器用法总结 - sirzhang - 博客园
3.Block
void (^blockName)(void) = ^void (void) { // ... }; blockName();
void (^blockName)(void) = ^{ // ... }; blockName();