iOS工程师面试指南:初中高级高频题解
一、内存管理与多线程
1.1 Objective-C中strong、weak、copy、assign的区别?
初级工程师 · 基础扎实
- strong:强引用,对象引用计数+1,只要引用计数不为0就不会被释放
- weak:弱引用,不增加引用计数,对象释放后自动置为nil,避免野指针
- copy:复制对象,创建新对象,常用于NSString、NSArray等有可变子类的类型
- assign:用于基本数据类型(int、float等),不进行内存管理
中级工程师 · 深入理解
- strong:默认修饰符,持有对象所有权,需要考虑循环引用问题
- weak:常用于delegate、block等场景,解决循环引用
- copy:深拷贝与浅拷贝的区别,对于可变对象是深拷贝,不可变对象是指针拷贝
- assign:除了基本数据类型,还可用于不持有所有权的对象引用(需手动管理)
高级工程师 · 系统设计
- 从编译器角度分析ARC实现原理
- weak表的实现机制和性能影响
- copy在Swift中的对应实现(Copy-on-Write)
- 内存管理在多线程环境下的线程安全问题
1.2 GCD中dispatch_sync和dispatch_async的区别?
初级回答
- dispatch_sync:同步执行,阻塞当前线程直到任务完成
- dispatch_async:异步执行,不阻塞当前线程,任务提交后立即返回
中级回答
- 同步执行的死锁风险分析
- 异步执行的线程切换开销
- 不同队列(串行、并发、主队列)的行为差异
- 任务派发的最佳实践场景
高级回答
- GCD底层线程池管理机制
- 任务调度算法和优先级处理
- 性能优化:避免过度创建线程
- 与OperationQueue的对比选型
二、UI/UX与性能优化
2.1 如何优化UITableView的滚动性能?
初级回答
- 使用cell复用机制
- 避免在cellForRowAtIndexPath中做复杂计算
- 图片异步加载和缓存
中级回答
- 预计算cell高度并缓存
- 使用CALayer代替UIView减少层级
- 异步绘制复杂UI
- 合理使用estimatedRowHeight
高级回答
- 离屏渲染的识别与优化
- 卡顿监控和性能分析工具使用
- 自定义异步绘制引擎
- 内存峰值控制和OOM预防
2.2 AutoLayout的性能优化
初级回答
- 减少约束数量
- 使用intrinsicContentSize
- 避免在循环中更新约束
中级回答
- 约束优先级的使用技巧
- 使用UIStackView简化布局
- 批量更新约束的方法
- 性能分析工具的使用
高级回答
- AutoLayout底层Cassowary算法原理
- 约束求解的性能瓶颈分析
- 自定义布局引擎的实现
- 混合布局方案的设计
三、网络与数据存储
3.1 HTTP/HTTPS的区别及HTTPS握手过程
初级回答
- HTTP是明文传输,HTTPS是加密传输
- HTTPS使用SSL/TLS加密
- HTTPS需要证书验证
中级回答
- 对称加密与非对称加密的结合
- 证书链验证过程
- 会话恢复机制
- 常见的安全攻击防范
高级回答
- TLS 1.2/1.3协议差异
- 前向安全性原理
- OCSP装订技术
- 证书透明化机制
3.2 CoreData与Realm的对比
初级回答
- CoreData是Apple官方框架,Realm是第三方库
- CoreData支持对象图管理,Realm性能更好
- 根据项目需求选择
中级回答
- 数据迁移难易度对比
- 多线程访问策略差异
- 查询性能基准测试
- 内存占用分析
高级回答
- 底层存储引擎原理对比
- 事务处理机制的实现差异
- 数据一致性的保证机制
- 大规模数据场景下的选型建议
四、架构设计与系统原理
4.1 MVC、MVVM、VIPER架构对比
初级回答
- MVC:Model-View-Controller,Apple推荐
- MVVM:数据绑定,适合复杂UI
- VIPER:职责分离更彻底
中级回答
- 各架构的适用场景分析
- 测试友好性对比
- 团队协作效率影响
- 学习成本和维护成本
高级回答
- 架构演进的历史背景
- 响应式编程在MVVM中的实现
- 跨平台架构的统一设计
- 微服务架构在移动端的应用
4.2 Runtime的应用场景
初级回答
- 方法交换(Method Swizzling)
- 动态添加方法和属性
- 获取类的所有属性和方法
中级回答
- 消息转发机制详解
- 关联对象(Associated Objects)的使用
- KVO/KVC的实现原理
- 性能监控和AOP实现
高级回答
- 方法缓存机制和性能优化
- 元类(Meta Class)的深入理解
- 与Swift Runtime的差异
- 动态特性在框架设计中的应用
五、调试与优化
5.1 如何定位和解决内存泄漏?
初级回答
- 使用Instruments的Leaks工具
- 检查循环引用
- 使用weak打破强引用环
中级回答
- 使用MLeaksFinder等工具
- 分析引用计数异常
- 检查NSTimer、CADisplayLink的持有关系
- Block的内存管理
高级回答
- 自动化内存泄漏检测方案
- 线上内存监控体系搭建
- 内存碎片化优化
- 虚拟内存和物理内存的管理
5.2 卡顿监控方案
初级回答
- 使用Instruments的Time Profiler
- 监控主线程耗时操作
- 避免在主线程做复杂计算
中级回答
- 使用CADisplayLink监控帧率
- 信号量监控主线程阻塞
- 耗时方法堆栈采集
- 自动化性能测试
高级回答
- 基于RunLoop的卡顿检测原理
- 线上卡顿数据采集和分析
- 机器学习在性能优化中的应用
- 全链路性能监控体系
六、Swift特性
6.1 Swift与Objective-C的主要区别
初级回答
- Swift是静态类型语言,OC是动态类型
- Swift更安全,可选类型避免空指针
- Swift语法更简洁现代
中级回答
- 值类型与引用类型的区别
- 协议和泛型的强大功能
- 错误处理机制的差异
- 内存管理方式的区别
高级回答
- Swift ABI稳定性的意义
- 与C++的互操作性
- 编译器优化技术的差异
- 未来发展方向和生态建设
6.2 Swift中的协议(Protocol)
初级回答
- 类似OC的协议,但更强大
- 可以定义属性和方法
- 支持协议扩展
中级回答
- 关联类型(Associated Type)
- 协议组合(Protocol Composition)
- 条件一致性(Conditional Conformance)
- 面向协议编程的优势
高级回答
- 协议在泛型编程中的应用
- 类型擦除(Type Erasure)技术
- 协议与元编程
- 在框架设计中的最佳实践
七、工程化与团队协作
7.1 组件化方案设计
初级回答
- 使用CocoaPods或Carthage管理依赖
- 模块化拆分业务代码
- 减少模块间耦合
中级回答
- 路由方案的设计与实现
- 组件通信机制(通知、代理、Block)
- 依赖注入框架的使用
- 二进制化加速编译
高级回答
- 微内核架构在移动端的应用
- 动态化加载方案
- 跨平台组件设计
- 大规模团队的协作流程
7.2 持续集成与自动化
初级回答
- 使用Jenkins或GitLab CI
- 自动化打包和测试
- 代码规范检查
中级回答
- 多环境配置管理
- 自动化性能测试
- 代码覆盖率统计
- 安全扫描集成
高级回答
- 容器化构建环境
- 灰度发布策略
- A/B测试框架集成
- 全链路监控告警
八、综合设计与系统设计
8.1 设计一个图片缓存框架
初级回答
- 使用NSCache实现内存缓存
- 磁盘缓存使用文件系统
- 支持异步下载和缓存
中级回答
- 多级缓存策略(内存→磁盘→网络)
- 缓存淘汰算法(LRU、LFU)
- 图片解码和压缩优化
- 支持动图和多格式
高级回答
- 内存映射文件优化磁盘IO
- 智能预加载策略
- 跨进程共享缓存
- 监控和自愈机制
8.2 设计一个网络层框架
初级回答
- 封装AFNetworking/Alamofire
- 统一错误处理
- 支持请求取消
中级回答
- 请求拦截器和插件机制
- 多环境配置和动态切换
- 请求重试和熔断机制
- 数据加密和签名
高级回答
- 多协议支持(HTTP/2、QUIC)
- 智能调度和负载均衡
- 端到端性能监控
- 与后端治理体系的对接
面试评估标准
初级工程师(0-2年)
- ✅ 基础语法和API熟练使用
- ✅ 能独立完成简单模块开发
- ✅ 了解基本的设计模式和架构
- ❌ 缺乏复杂问题解决经验
- ❌ 系统原理理解较浅
中级工程师(2-5年)
- ✅ 能独立负责核心模块
- ✅ 有性能优化和问题排查经验
- ✅ 熟悉常用框架和工具链
- ✅ 具备一定的架构设计能力
- ❌ 缺乏大规模系统经验
高级工程师(5年以上)
- ✅ 能主导技术方案设计和评审
- ✅ 有大型项目架构经验
- ✅ 深入理解系统原理和底层机制
- ✅ 具备技术规划和团队管理能力
- ✅ 能解决复杂的技术难题
准备建议
技术准备
- 基础知识:扎实的语言基础和框架理解
- 项目经验:准备2-3个有深度的项目案例
- 系统设计:练习系统设计题,画架构图
- 算法题:LeetCode中等难度以上题目
面试技巧
- 清晰表达:用STAR法则描述项目经验
- 深度思考:不仅回答what,还要回答why
- 主动沟通:确认问题理解,展示思考过程
- 提问环节:准备有深度的问题反问面试官
资源推荐
- 官方文档:Apple Developer Documentation
- 开源项目:AFNetworking、SDWebImage源码学习
- 技术博客:ObjC中国、SwiftGG、唐巧博客
- 实践平台:LeetCode、HackerRank
文档最后更新:2026年3月2日
适用岗位:iOS开发工程师
考察重点:技术深度 + 工程能力 + 系统思维