面试题(5家2offer顺利通过)
- 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();
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
