美团面试题及答案

美团面试题及答案

美团面试题

1、Block 的底层原理,结构,内存以及需要注意的地方。

block本质上也是一个OC对象,它内部也有个isa指针。
block是封装了函数调用以及函数调用环境的OC对象。
block的底层结构

block类型 环境
NSGlobalBlock 没有访问auto变量
NSStackBlock 访问了auto变量
NSMallocBlock NSStackBlock调用了copy

2、图片渲染,一张 png/jpg 格式的图片渲染到页面上显示有哪些流程。png 和 jpg 的区别。png 一定是无损的吗?

图片渲染的过程: 读取文件 -> 计算frame ->图片解码 ->解码后通过数据总线交给GPU ->GPU获取图片frame后进行顶点变换计算 ->光栅化 ->根据纹理坐标获取每一个像素点的颜色值 -> 交给帧缓冲区 ->渲染到屏幕上

iOS中图片渲染的流程

iOS 保持界面流畅的技巧

iOS图形原理与离屏渲染

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
面向连接 面向数据报
可靠传输 不可靠传输
传输效率低 传输效率高

10、SDWebImage 的框架结构,缓存机制。

11、Git 的 rebase 的原理。Git 流程。

12、对组件化的了解,组件化是为了解决什么问题。

13、JSPatch 的原理。

14、单例是为了处理什么问题而使用的,单例和全局变量的区别。

15、对设计模式的掌握。

16、分层打印二叉树。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×