- 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) { // ...

本文详细探讨了iOS面试中常见的知识点,包括runtime、NSTimer、Block、多线程、UIView与CALayer的区别、内存管理、响应链、KVO与KVC、SDWebImage、性能优化、数据存储、设计模式、网络层socket与http区别以及App生命周期等。重点讲解了Block的底层原理、多线程中GCD的信号量使用、UIView与CALayer在内存管理和事件传递上的差异,以及响应式编程的概念。
&spm=1001.2101.3001.5002&articleId=120403115&d=1&t=3&u=764779f2bf7347a79defea9e5ca33072)
591

被折叠的 条评论
为什么被折叠?



