1、Block 的底层原理,结构,内存以及需要注意的地方。
block本质上也是一个OC对象,它内部也有个isa指针。
block是封装了函数调用以及函数调用环境的OC对象。
block类型 | 环境 |
---|---|
NSGlobalBlock | 没有访问auto变量 |
NSStackBlock | 访问了auto变量 |
NSMallocBlock | NSStackBlock调用了copy |
2、图片渲染,一张 png/jpg 格式的图片渲染到页面上显示有哪些流程。png 和 jpg 的区别。png 一定是无损的吗?
图片渲染的过程: 读取文件 -> 计算frame ->图片解码 ->解码后通过数据总线交给GPU ->GPU获取图片frame后进行顶点变换计算 ->光栅化 ->根据纹理坐标获取每一个像素点的颜色值 -> 交给帧缓冲区 ->渲染到屏幕上
3、Runtime。
OC中的方法调用其实都是转成了objc_msgSend函数的调用,给receiver(方法调用者)发送了一条消息(selector方法名)
objc_msgSend底层有3大阶段
消息发送(当前类、父类中查找)、动态方法解析、消息转发
具体应用
利用关联对象(AssociatedObject)给分类添加属性
遍历类的所有成员变量(修改textfield的占位文字颜色、字典转模型、自动归档解档)
交换方法实现(交换系统的方法)
利用消息转发机制解决方法找不到的异常问题
4、Runloop 的结构和循环流程,用 Runloop 做过什么事情。
01、通知Observers:进入Loop
02、通知Observers:即将处理Timers
03、通知Observers:即将处理Sources
04、处理Blocks
05、处理Source0(可能会再次处理Blocks)
06、如果存在Source1,就跳转到第8步
07、通知Observers:开始休眠(等待消息唤醒)
08、通知Observers:结束休眠(被某个消息唤醒)
01> 处理Timer
02> 处理GCD Async To Main Queue
03> 处理Source1
09、处理Blocks
10、根据前面的执行结果,决定如何操作
01> 回到第02步
02> 退出Loop
11、通知Observers:退出Loop
控制线程生命周期(线程保活)
解决NSTimer在滑动时停止工作的问题
监控应用卡顿
性能优化
5、多线程,NSOperationQueue 和 GCD 的区别。用多线程做过什么事情。线程安全的问题。加锁有几种方式。
dispatch_after
dispatch_group
dispatch_barrier
dispatch_once
OSSpinLock
os_unfair_lock
pthread_mutex
dispatch_semaphore
dispatch_queue(DISPATCH_QUEUE_SERIAL)
NSLock
NSRecursiveLock
NSCondition
NSConditionLock
@synchronized
6、NSURLSession 和 NSURLConnection 的区别, NSURLConnection 是怎么封装的。CFNetwork。
7、做过什么动画。
8、HTTPS 的工作原理,和 HTTP 的区别。RSA 加密原理。
9、网络层级,TCP 和 UDP 的区别。
TCP | UDP | |
---|---|---|
面向连接 | 面向数据报 | |
可靠传输 | 不可靠传输 | |
传输效率低 | 传输效率高 |