版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2026iOS开发高频面试题(附详细实操答案)整理了一线互联网公司iOS面试高频考题,覆盖Swift基础、内存管理、UI生命周期、多线程、网络、架构、性能优化、实战踩坑等核心模块,答案均为开发实战总结,贴合面试口述逻辑,无书面套话,适合求职复盘、面试突击。一、Swift核心基础题1.说说let、var、lazy的区别及实际使用场景参考答案:var是可变变量,初始化后可以修改值,日常开发中需要动态变更的数据都用var,比如页面状态、接口返回的可变数据、计数器等。let是常量,初始化赋值后无法修改,推荐优先使用。Swift开发规范中,能不用可变就不用可变,既能保证数据安全,也能提升编译效率,固定文本、固定配置、不改变的对象实例都用let。lazy是懒加载属性,只能修饰var,不能修饰let。特点是首次访问时才初始化赋值,不会随对象创建立即加载。实际场景:1.用于创建开销大的控件、视图、网络请求工具类,避免页面初始化卡顿;2.解决属性相互依赖的初始化问题;3.配合闭包懒加载控件,简化代码结构,统一页面UI初始化逻辑。2.Swift可选类型?和!的区别,日常开发怎么规范使用?参考答案:?代表可选类型,值可以是具体数据,也可以是nil。使用时会自动解包失败保护,不会直接崩溃,是日常最常用的写法。!代表强制解包,强制解析可选值。如果值为nil,程序会直接崩溃,属于高危写法。开发规范:1.禁止随意使用强制解包!,仅在百分百确定数值非空的场景使用,比如系统回调、固定赋值的属性;2.常规解包优先使用iflet、guardlet可选绑定,安全解析可选值;3.简单场景可使用空合运算符??赋默认值,代码更简洁。3.结构体和类的核心区别,什么时候用结构体、什么时候用类?参考答案:1.存储方式:结构体是值类型,存储在栈区;类是引用类型,存储在堆区。值类型赋值、传参时会完整拷贝一份数据,引用类型仅传递内存地址。2.继承特性:结构体不支持继承、重写;类支持继承、多态、重写方法。3.生命周期:结构体无需手动管理内存,系统自动回收;类需要配合ARC管理引用计数,处理内存泄漏问题。4.可变特性:结构体想要修改自身属性,需要mutating修饰方法;类可直接修改属性。使用场景:结构体:纯数据模型、枚举、配置项、尺寸坐标等轻量数据,比如用户信息Model、接口参数Model;类:需要继承、复用、拥有复杂生命周期、需要持久持有、存在业务逻辑的对象,比如ViewController、自定义View、网络工具类、单例类。二、内存管理核心(面试高频)1.讲讲SwiftARC原理,strong、weak、unowned区别参考答案:ARC即自动引用计数,是iOS内存管理的核心机制。系统会自动统计对象的引用次数,引用计数大于0时对象常驻内存,引用计数归0时系统自动销毁对象、释放内存,无需开发者手动申请和释放内存。三种修饰符区别:1.strong:强引用,默认修饰符。持有对象时,对象引用计数+1,只要有强引用指向对象,对象就不会被销毁。适用于绝大多数需要持有使用的对象、控件、数据模型。2.weak:弱引用,不增加引用计数。对象销毁后,弱引用指针会自动置nil,不会产生野指针崩溃。专门用于解决循环引用,最常用在代理、闭包、子控件引用父对象场景。3.unowned:无主引用,同样不增加引用计数。和weak最大的区别是,对象销毁后指针不会置nil,再次访问会直接崩溃。适用于百分百和宿主对象共存、不会提前销毁的场景,性能略优于weak。2.什么是循环引用?日常开发中哪些场景容易出现,怎么解决?参考答案:两个或多个对象互相强引用对方,导致彼此引用计数永远无法归0,对象无法销毁,造成内存泄漏,这就是循环引用。高频场景:1.控制器持有闭包,闭包内部强引用self;2.父子视图互相强引用;3.代理属性用strong修饰(默认必须用weak);4.两个Model互相持有对方。解决方案:1.闭包中使用[weakself]/[unownedself]打破循环引用,常规业务优先用weakself;2.代理、回调属性统一用weak修饰;3.双向持有场景,保证一方弱引用,一方强引用。3.闭包中weakself和unownedself怎么选型?参考答案:1.weakself:安全优先。闭包回调时机不确定(比如网络请求、延时回调),页面可能提前销毁,用weakself,自动解包为nil,避免崩溃,是日常90%场景的首选。2.unownedself:性能优先。百分百确定闭包执行时self一定存在,无销毁风险时使用,比如页面内同步回调、即时执行的闭包,无需可选解包,代码更简洁。三、UI与视图生命周期1.UIViewController完整生命周期及各方法使用场景参考答案:1.init:控制器初始化,仅执行一次,用于初始化属性、配置基础数据;2.viewDidLoad:视图加载完成,仅执行一次。核心初始化方法,用于创建控件、赋值数据、注册通知、配置约束;3.viewWillAppear:视图即将展示,每次页面出现都会调用。用于刷新页面数据、开启定时器、统计页面曝光;4.viewDidAppear:视图已经展示在屏幕上,用于开启动画、执行页面加载完成后的延时操作;5.viewWillDisappear:视图即将消失,用于关闭定时器、移除监听、保存临时数据、终止网络请求;6.viewDidDisappear:视图已经消失,用于释放页面无用资源、清空临时数据;7.deinit:控制器销毁,用于移除通知、移除KVO、清空代理,排查内存泄漏。2.UIView和CALayer的区别参考答案:1.响应事件:UIView继承自UIResponder,可以接收、处理触摸、点击等用户交互事件;CALayer仅负责渲染,不处理任何交互。2.层级关系:每个UIView内部都默认绑定一个CALayer,页面的所有视图渲染、图层展示都由CALayer完成,UIView是CALayer的事件封装层。3.动画性能:CALayer属于底层渲染,动画、圆角、阴影操作性能优于UIView,复杂动画优先操作Layer。4.坐标属性:UIView用frame布局,CALayer用bounds、position布局。3.为什么大量圆角、阴影会导致页面卡顿?怎么优化?参考答案:默认设置圆角、阴影时,系统会触发离屏渲染。离屏渲染需要额外开辟缓冲区绘制图层,频繁、大量操作会占用CPU、GPU资源,直接导致页面滑动卡顿、帧率下降。优化方案:1.圆角优化:优先使用贝塞尔曲线裁剪,替代系统默认圆角;静态视图可提前裁剪图片,避免实时渲染;2.阴影优化:设置shadowPath固定阴影路径,让系统无需实时计算阴影范围,大幅降低渲染开销;3.开启shouldRasterize光栅化,将静态视图渲染为位图缓存,减少重复渲染;4.避免同时给多层视图添加圆角、阴影,减少叠加渲染压力。四、多线程与GCD(核心难点)1.GCD串行、并行队列,同步、异步任务的区别与组合效果参考答案:队列特性:串行队列:任务按顺序执行,前一个任务结束后,才会执行下一个,同一时间仅一个任务执行;并行队列:任务同时并发执行,系统自动开启多线程调度,多个任务可同时运行。任务特性:同步任务sync:阻塞当前线程,任务执行完毕后,代码才会继续往下走,不开启新线程;异步任务async:不阻塞当前线程,直接开启新线程执行任务,代码无需等待任务完成即可继续执行。四种组合效果:1.串行+同步:不开启新线程,顺序执行,阻塞当前线程;2.串行+异步:开启一条新线程,任务顺序执行,不阻塞当前线程;3.并行+同步:不开启新线程,顺序执行,阻塞当前线程;4.并行+异步:开启多条新线程,任务并发执行,不阻塞当前线程(最常用)。2.主线程卡死的原因,日常怎么避免?参考答案:iOS所有UI渲染、刷新、交互事件都在主线程执行,主线程阻塞就会导致页面卡顿、无响应、黑屏。卡死原因:1.主线程执行耗时操作,比如大量数据遍历、文件读写、大数据解析、同步网络请求;2.主线程嵌套锁、死锁;3.循环引用、大量对象创建导致主线程卡顿。解决方案:1.所有耗时操作全部丢到子线程执行,数据处理完成后,切回主线程刷新UI;2.禁止在主线程使用sync同步任务;3.拆分耗时任务,分批执行,避免单次线程压力过大。3.GCD死锁场景及原理参考答案:核心原理:当前线程处于某个队列中,又在当前队列执行同步任务sync,队列等待当前任务结束,当前任务等待队列执行完成,互相等待形成死锁。最常见场景:主线程中调用DispatchQueue.main.sync同步任务,百分百死锁崩溃。规避方案:主线程刷新UI统一用async;子线程同步任务仅用于数据同步、线程安全场景,不嵌套自身队列。五、网络与数据持久化1.URLSession和AFNetworking的关系,底层原理参考答案:URLSession是系统原生网络请求框架,iOS7之后替代老旧的NSURLConnection,是底层原生网络能力,支持断点续传、后台请求、并发请求。AFNetworking是基于URLSession封装的第三方框架,属于业务层封装,原生URLSession仅提供基础请求能力,代码繁琐,缺少通用封装。AFN封装了请求参数序列化、响应解析、超时处理、证书验证、网络状态监听、统一错误处理,大幅简化业务网络代码,是iOS开发主流网络方案。2.网络请求中get和post的区别,业务怎么选型?参考答案:1.参数传递:get参数拼接在URL后面,公开可见;post参数放在请求体中,相对隐蔽;2.数据长度:get有URL长度限制,无法传递大数据;post无长度限制,支持大文本、文件、图片上传;3.缓存机制:get请求默认可缓存,刷新速度快;post默认不缓存;4.幂等性:get是幂等请求,多次请求结果一致;post非幂等,多次请求可能产生多条数据。选型规范:查询数据、获取列表、详情、无需修改服务端数据用GET;提交数据、登录注册、上传文件、新增/修改/删除数据用POST。3.UserDefaults和Keychain的区别参考答案:1.存储特性:UserDefaults属于轻量级偏好设置,适合存储少量配置数据;Keychain是系统安全钥匙串,专门存储隐私敏感数据。2.数据生命周期:UserDefaults数据随App卸载、重装清空;Keychain数据跟随设备,卸载App后数据依然保留,重装可读取。3.安全性:UserDefaults数据明文存储,安全性极低,不存敏感数据;Keychain系统加密存储,安全性高。业务选型:UserDefaults:存储主题设置、字体大小、首次启动标记、页面缓存开关等普通配置;Keychain:存储用户token、密码、设备唯一标识、登录凭证等敏感数据。六、架构与设计模式1.MVC、MVVM的区别,项目中为什么主推MVVM?参考答案:MVC:Model(数据)、View(视图)、Controller(控制器)。传统MVC中Controller承担大量业务逻辑、数据解析、网络请求、视图代理逻辑,极易臃肿,代码耦合严重,后期维护、迭代成本高,单元测试难度大。MVVM:Model(数据)、View(视图)、ViewModel(视图模型)。核心是抽出ViewModel层,承担所有业务逻辑、网络请求、数据处理、数据格式化,Controller只负责绑定数据、管理视图生命周期,极致瘦身。MVVM优势:1.代码解耦,职责单一,Controller轻量化;2.ViewModel可复用,多页面可共用同一套业务逻辑;3.方便单元测试,无需依赖视图即可测试业务逻辑;4.配合响应式编程,数据驱动视图,代码更简洁。2.单例模式的实现方式、优缺点及使用规范参考答案:常用实现(Swift):静态常量全局初始化,利用static静态属性线程安全特性,写法简洁、安全高效。优点:全局唯一实例,全局共享、随时调用,避免重复创建对象,节省内存开销,统一管理全局配置、工具类逻辑。缺点:全局常驻内存,生命周期和App一致,无法主动销毁;滥用会导致代码耦合严重、调试困难、依赖混乱。使用规范:仅用于全局工具类、网络管理、配置管理、日志管理、设备信息管理,禁止业务页面逻辑使用单例。七、性能优化与实战踩坑1.日常开发中,你做过哪些iOS性能优化?参考答案:1.UI渲染优化:优化圆角阴影离屏渲染、减少图层嵌套、缓存静态视图、按需刷新UI,避免全局刷新;2.内存优化:解决循环引用、及时释放无用资源、页面deinit清空监听和定时器、用Instruments检测内存泄漏;3.列表优化:Cell高度缓存、复用Cell、减少Cell内动态计算、预加载数据、分批渲染,解决TableView/CollectionView滑动卡顿;4.线程优化:耗时操作全部子线程执行、任务拆分、避免主线程阻塞、杜绝频繁创建销毁线程;5.网络优化:接口缓存、减少无效请求、合并重复请求、超时重试、弱网/异常兜底处理;6.启动优化:拆分启动任务、主线程只做核心UI初始化、非核心任务异步延迟加载、减少启动时文件读写和数据计算。2.定时器NSTimer、DispatchSourceTimer的坑及解决方案参考答案:NSTimer问题:1.绑定RunLoop,主线程卡顿、滚动视图时会暂停计时,精度差;2.容易产生循环引用,控制器无法释放,必须手动invalidate销毁,否则内存泄漏;3.依赖主线程,子线程使用需要手动开启RunLoop。DispatchSourceTimer优势:基于GCD实现,不依赖RunLoop、精度更高、后台可计时、线程自由、无RunLoop卡顿问题,是目前项目首选定时器方案。通用规范:页面消失、视图销毁时,手动取消、清空定时器,杜绝内存泄漏。3.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 具身智能在远程医疗咨询中的交互方案
- 学校智能洗浴系统可行性研究报告怎么写范文
- 具身智能+工业机器人操作培训研究报告
- 2025中国智能商业落地研究报告范文
- EVA带教效果评估方案
- 2026网络信息安全服务市场需求变化与防御体系升级报告
- 2026人机交互技术发展分析及前景趋势与投融资发展机会研究报告
- IT基础设施升级指导书预案
- 2025年山东省曲阜市高二生物上册期末考试真题(预热题)附答案
- 电视台节目制作人节目策划与执行力绩效考评表
- 前列腺增生病人的护理查房
- 电力工程建设与管理指南(标准版)
- 2026中级消防监控证考试题目及答案
- 2025年新版中控证考试题及答案
- 进户门安装合同协议书
- 村卫生室标准化建设课件
- TD/T 1023-2010市(地)级土地利用总体规划编制规程
- 《农机安全生产重大事故隐患判定标准(试行)》解读与培训
- 客服基础考试试题及答案
- 评判性思维在临床中的应用
- 中小学人工智能课程教学指南
评论
0/150
提交评论