面试主要分为三块内容:项目、iOS底层原理和通用编程技能。
[toc]
- Block 数据结构
- 捕获变量
- __block (原始类型、对象类型)
- 内存管理方式(block的内存管理、捕获变量的内存管理)
-
描述引用计数
-
MRC 和 ARC
-
Autorelease & Autoreleasepool
- Autoreleasepool 和 run loop 关系
-
参考
-
类的结构模型,了解 class_data_bits_t, class_rw_t, class_ro_t
-
方法调用
- 方法结构
- 消息发送过程
- 消息转发
-
关联对象的存储
-
程序启动做了什么事情 (加载镜像)
-
分类的加载时机和方法重载
-
+load vs. +initialize
-
MetaClass 设计
-
- 区分类方法和实例方法的存储:前者存放在元类;后者存放在类
- 消息发送逻辑能够复用
-
参考
- 深入解析 ObjC 中方法的结构
- objc4 源码 (建议多看这个)
- 对象类型 (RunLoop, RunLoopMode, Source, Timer, Observer)
- Runloop 和线程关系
- Runloop 场景比较多,要多讲讲
- 参考
- 实现原理
- 类型重写
- 回调方法的执行线程
- 观察同一对象的同一属性,同时使用自定义的 KVO和系统KVO会有什么效果?
-
大概了解渲染框架结构 (Core Animation, Core Graphics, Open GL/Metal)
-
了解整个渲染 Pipeline,知道每个过程做些什么
-
iOS界面渲染流程分析,渲染核心原理围绕:前后帧缓存,Vsync信号,CADisplayLink
- CPU 创建视图,布局,构建视图和图层关系,查询 drawRect
-
- 布局计算(自动布局)
- 视图创建
- drawRect:
- 解压图片
- 图层打包
-
CPU将图层打包,提交到渲染服务器(Open GL & GPU)
-
渲染服务器生成纹理并着色,生成前后帧缓存,并根据Vsync信号切换缓存
-
GPU 渲染
-
显示图片(详解图片加载和优化方案)
- 显示图片分三步:加载(UIImage),解码(生成位图),渲染
- 开发常规只接触加载,解码和渲染由 UIKit 完成
- 列表控件中展示多个图片,会造成内存和CPU陡升,优化方案:
- 降采样(因为界面显示的图片大小通常小于真实图片大小,所以加载缩略图能降低内存占用)
- 预处理和子线程解码(prefetchItem 代理方法中,异步解码图片)
- 使用Image Assets Catalogs,因为这是iOS自带的资源加载方案,便于优化
-
图片高级处理系列
-
- 现象:GPU在frame buffer之外额外开辟的内存
- 原因:因为视图层级问题,无法一次性渲染整个层级,“画家算法”(从下往上一层一层渲染),导致有些元素无法一次性渲染生效,需要等整个层级渲染结束后,再作用,所以需要额外的空间缓存
- 通过layer的阴影、圆角、mask等属性引发
-
参考
-
FastImageCache
-
-
解决什么需求:一款应用主要的性能瓶颈在于图片加载。按照传统的方式,从磁盘中单张读取图片效率太低,尤其是在列表控件中。
-
怎么做
-
- 将图片持久化到磁盘
- 用 LRU 策略自动管理图片过期
- 模型化????怎么理解
-
需求场景
-
-
描述:照片浏览,需要加载图片并滑动浏览
-
问题:从磁盘中加载压缩过的图片,并展示到屏幕上,是个昂贵的开销
-
解决的核心技术:
-
- 内存映射
- 图片解压,保存解压后的图片(所以这个库更适用于小图片,否则磁盘会占用很大)
- 字节对齐
-
-
-
UIResponder 子类 (UIView, UIViewController, UIApplication)
-
描述传递和响应两个过程
-
怎么扩大按钮点击区域?
- 子类化,重写 pointInside:withEvents:
-
Responder vs. GestureRecognizer vs. UIControl
-
- GestureRecognizer 实现原理:内部有 UIGestureRecognizerSubclass,也是通过 touches 方法判定手势是否成功
- hitTest 过程中添加 gesture recognizer 信息
- 优先级:UIControl(系统) > GestureRecognizer > Responder
-
几个类型
-
- NSNotification
- NSNotificationCenter
- NSNotificationQueue:维护队列,依赖 run loop,适当时机发送通知
-
数据结构
-
-
如何存通知
-
- name & object 两个维度
- Observation 链表结构
-
-
注册监听
-
发送通知
-
移除监听
- iOS中常用的多线程方案 (GCD & NSOperation),对这两套API要比较熟悉
- 具体场景给出解决方案
- 锁的种类
- @synchronized
- HTTP 请求的完整链路
- URL
- Method
- Request Header & Response Header
- Status Code
- HTTPS 加密过程
- 鉴权(OAuth)
- TCP 握手和挥手过程
- HTTP 版本更新
-
组件化方案,路由设计
-
MVC、MVVM、MVP
-
包管理(CocoaPods 做了什么)
-
App 组织
-
网络请求 (NSURLSession, AFNetworking
-
页面如何组织 (
-
- 架构模式
- 代码规范
- 布局
- VC 派生结构
- SB, Xib, Code
-
数据持久化
-
- Plist
- UserDefault
- Archive
- sqlite
-
动态部署
-
- 热更新
- 降级方案
- 团队管理
- 收集用户数据
- 组件化和组件通信
- CI、CD
-
- 数据结构 (数组、链表、栈、队列、二叉树)