版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS开发面试题及详细答案(真实面试版)一、Swift基础语法面试题1、Swift中let和var的区别?答案:let是常量,赋值后不可修改,底层内存地址和值都固定,推荐优先使用,安全性更高;var是变量,赋值后可以随时修改数值。补充关键点:1)let修饰引用类型(对象)时,对象地址不可变,但对象内部的属性如果是var可以修改;2)Swift开发规范要求:能使用let绝不使用var,减少变量风险,提升代码稳定性。2、Swift可选类型Optional的作用?!和?的区别?答案:可选类型用于解决值可能为空的问题,是Swift空安全的核心设计,所有可选类型默认有两种状态:有值、nil。区别:1)?代表可选,未解包,使用时需要解包,不会直接崩溃;2)!代表强制解包,开发者手动告诉编译器「该值一定不为空」,如果值为nil会直接闪退。日常开发禁止滥用强制解包,优先使用可选绑定、空合并运算符、守卫判断解包。3、guard和iflet的区别和使用场景?答案:两者都用于可选值解包、条件判断,核心区别在于代码结构和作用域。1)iflet:解包后的变量仅在if代码块内生效,适合局部逻辑判断,多层判断容易产生金字塔嵌套;2)guardlet:解包后的变量在当前整个函数作用域生效,条件不满足直接return/break,能够扁平化代码,减少嵌套,优先用于参数校验、前置条件判断。开发规范:前置校验一律用guard,业务分支判断用iflet。4、struct和class的核心区别?答案:1)存储方式:struct是值类型,存储在栈区;class是引用类型,存储在堆区;2)赋值逻辑:结构体赋值是值拷贝,新旧对象互不影响;类对象赋值是地址拷贝,多个变量指向同一个内存对象;3)继承特性:结构体不支持继承,类支持继承、多态;4)构造器:结构体有默认成员构造器,类没有默认构造器;5)析构函数:类有deinit析构方法,结构体没有。日常开发:纯数据模型优先用struct,需要复用、继承、生命周期管理的业务对象用class。5、Swift中闭包的循环引用如何解决?答案:闭包会强引用内部使用的外部对象,如果对象又强引用闭包,就会形成循环引用,导致内存泄漏。解决方案:1)常规场景使用weak修饰对象,打破强引用;2)需要对象生命周期必须存在的场景,使用unowned;区分:weak是弱引用,对象销毁后自动置nil,安全;unowned是无主引用,对象销毁后访问会崩溃,谨慎使用。二、OC基础与混编面试题1、OC中strong、weak、assign、copy的区别?答案:1)strong:强引用,默认属性修饰符,持有对象,引用计数+1,对象不会被释放,适用于绝大多数对象类型;2)weak:弱引用,不持有对象,引用计数不变,对象销毁后自动置nil,主要用于解决循环引用(代理、闭包、控件引用);3)assign:直接赋值,不做内存管理,用于基本数据类型(int、float),修饰对象会产生野指针;4)copy:拷贝特性,immutable对象拷贝指针,mutable对象深拷贝,主要用于NSString、Block,防止外部修改内部数据。2、OCautoreleasepool原理和使用场景?答案:autoreleasepool是自动释放池,用于延迟释放对象,所有加入池子的对象,会在池子结束时统一调用release。原理:线程默认自带自动释放池,runloop每次循环结束自动清空池子;手动创建的池子,在大括号结束时立即释放内部对象。使用场景:大量循环创建临时对象(如批量解析数据、遍历图片),手动加autoreleasepool降低内存峰值,避免内存暴涨。3、Swift和OC混编注意事项?答案:1)OC调用Swift:项目自动生成Swift头文件(项目名-Swift.h),导入后即可调用,Swift类需要继承NSObject、添加@objc暴露方法;2)Swift调用OC:在Bridging-Header桥接文件中导入OC头文件,全局生效;3)注意点:Swift枚举、结构体默认不暴露给OC,需要兼容OC时改用类、添加@objc;Swift空安全类型在OC中会转为nullable/nonnull。三、UI与布局面试题1、Frame和AutoLayout的区别?各自优缺点?答案:1)Frame:通过坐标、宽高布局,基于绝对位置。优点:底层高效、逻辑简单、无布局约束冲突;缺点:适配多机型、屏幕旋转成本极高,动态修改布局繁琐。2)AutoLayout:基于相对约束布局,依靠父子控件、同级控件关系布局。优点:适配性强、适配多屏幕、动态布局灵活;缺点:约束冲突会导致布局异常,复杂页面约束冗余会造成轻微性能损耗。日常开发:简单固定控件、自定义绘图用Frame;大部分业务页面、适配页面用AutoLayout。2、UIView和CALayer的区别?答案:1)职责不同:UIView负责事件响应、手势交互、用户交互逻辑;CALayer负责页面绘制、渲染、展示,不处理交互;2)层级关系:每个UIView内部都自带一个CALayer,页面展示靠Layer,交互靠View;3)属性差异:圆角、阴影、边框、透明度属于Layer属性;点击、手势、用户交互开启属于View属性;4)性能:直接操作Layer比View更高效,但是Layer无交互能力。3、TableView卡顿优化方案?答案:TableView卡顿核心原因是主线程渲染、计算、绘制耗时,优化从以下几点入手:1)cell复用机制规范使用,禁止重复创建cell,保证复用标识符统一;2)提前计算cell高度,缓存高度,避免实时计算(estimatedRowHeight谨慎使用);3)减少cell内子控件层级,合并冗余控件,减少图层混合;4)图片异步加载、预解码,避免主线程处理图片;5)滑动时停止刷新、停止网络请求,结束后再更新UI;6)复杂视图预渲染、离屏渲染优化,避免大量圆角阴影叠加;7)数据分批加载、分页加载,避免一次性渲染大量数据。四、多线程与GCD面试题1、GCD队列类型、同步异步区别?答案:队列分两种:串行队列(任务逐个执行)、并发队列(任务同时执行);执行方式分两种:同步sync、异步async。1)async异步:开辟新线程,不会阻塞当前线程,任务后台执行;2)sync同步:不开新线程,阻塞当前线程,等待任务执行完毕再继续后续代码。组合结果:异步串行:新开线程,任务有序执行;异步并发:新开多条线程,任务无序并发执行;同步串行/并发:均在当前线程执行,阻塞线程。2、GCD死锁产生的原因?常见场景?答案:死锁核心:当前串行队列,同步派发任务到自身队列,互相等待,线程卡死。常见场景:1)主队列同步执行任务:主线程sync调用主队列任务,百分百死锁;2)自定义串行队列,内部再同步派发当前队列任务,造成互相等待。解决:串行队列内部嵌套任务一律用异步,禁止当前队列同步嵌套。3、GCD栅栏函数、延时函数、单例原理?答案:1)栅栏barrier:在并发队列中,栅栏前的任务全部执行完,再执行栅栏任务,栅栏任务结束后,后续任务再并发执行,用于读写安全、数据同步;2)延时dispatchAfter:不是定时执行,是延时将任务加入队列,时间不准确,依赖队列调度;3)GCD单例:利用dispatch_once线程安全、全局仅执行一次的特性,保证多线程环境下单例唯一,线程安全,是目前最优的OC/Swift单例写法。五、内存管理面试题1、iOS内存泄漏常见场景及排查方案?答案:常见泄漏场景:1)闭包未弱引用self,造成循环引用;2)代理未用weak修饰,控制器无法释放;3)定时器NSTimer强引用控制器,页面退出未销毁定时器;4)全局变量、静态变量持有页面对象;5)缓存池、数组长期持有对象,未及时清空。排查方案:1)使用XcodeInstruments工具(Leaks、Zombies)检测泄漏;2)页面退出后打印对象是否释放,验证deinit是否执行;3)代码规范校验,统一处理代理、定时器、闭包引用。2、NSTimer为什么会造成内存泄漏?如何解决?答案:NSTimer会强引用target(当前控制器),RunLoop又强持有定时器,控制器又强持有定时器,形成循环引用,页面退出后控制器无法释放,定时器依旧运行。解决方案:1)页面销毁前手动invalidate销毁定时器,置空对象;2)使用Timer+弱引用代理封装,打破循环引用;3)使用GCD延时定时器替代NSTimer,无需手动销毁,自动释放。六、性能优化面试题1、离屏渲染是什么?如何优化?答案:正常渲染是屏幕当前帧渲染,离屏渲染是先在离线缓冲区绘制,再刷新到屏幕,会消耗大量GPU资源,造成卡顿、掉帧。触发场景:圆角+裁剪、阴影、遮罩、渐变、光栅化。优化方案:1)简单圆角优先用贝塞尔曲线裁剪,避免同时开启阴影和圆角;2)固定静态视图提前光栅化,动态视图禁止光栅化;3)使用图片预渲染替代实时图层渲染;4)减少冗余图层,合并重复绘制视图。2、APP启动优化怎么做?答案:APP启动分为冷启动、热启动,优化核心是缩短主线程耗时,将非必要任务异步、延后执行。1)预处理优化:减少main函数之前的静态库、冗余配置、编译资源;2)main函数后优化:主线程只保留UI初始化、核心配置,所有第三方注册、数据初始化、日志、统计、埋点全部异步子线程执行;3)资源优化:压缩图片、删除冗余资源、按需加载资源;4)业务优化:首页数据懒加载、页面渲染完成后再请求次要接口;5)分包优化:拆分冗余库,减少启动加载代码量。七、网络与实战面试题1、iOS网络层封装思路?答案:常规项目网络层分为三层,职责清晰、解耦易维护:1)底层基础层:基于URLSession封装,处理请求、响应、超时、证书验证、参数公共配置;2)中间拦截层:统一处理请求头、签名、token、参数加密、错误码拦截、重试机制、loading弹窗、日志打印;3)业务接口层:拆分各个业务模块接口,统一返回模型,控制器只调用业务方法,不处理底层网络逻辑。额外封装:缓存机制、无网重试、弱网适配、批量请求管理。2、HTTP和HTTPS区别?答案:1)HTTP明文传输,无加密,端口80,数据容易被抓包、篡改、劫持,不安全;2)HTTPS是HTTP+SSL/TLS加密传输,端口443,传输数据加密,防止抓包和篡改,需要证书校验;3)HTTPS握手过程更耗时,比HTTP略微消耗性能,但安全性满足上线要求,目前所有商业APP均强制使用HTTPS。八、底层原理面试题1、RunLoop原理及作用?答案:RunLoop是运行循环,本质是一个死循环,保证线程不退出,持续监听事件。主线程默认开启RunLoop,维持页面刷新、点击事件、手势、定时器、网络回调;子线程默认无RunLoop,执行完任务立即销毁。核心作用:1)管理线程生命周期,空闲时休眠,有任务时唤醒,节省资源;2)处理各种事件源(触摸、定时器、端口、网络);3)自动释放池的创建和销毁依赖RunLoop循环。2、Swift响应式编程Combine核心用法?答案:Combine是Swift原生响应式框架,替代第三方RxSwift,核心是Publisher(发布者)、Subscriber(订阅者)。核心逻辑:发布者发送事件(值、完成、错误),订阅者接收事件处理UI更新、数据刷新。常用场景:数据双向绑定、网络请求回调、表单校验、状态监听、页面联动,需要通过AnyCancellable管理订阅生命周期,页面销毁取消订阅,防止内存泄漏。九、面试高频实操问答1、为什么开发中尽量不用perform
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五年级数学下册 第7课时 公倍数和最小公倍数
- 基于杜邦分析透视J房企轻资产运营绩效:理论、实践与启示
- 基于机器视觉的成捆棒材计数方法:技术革新与实践应用
- 基于机器学习的交通事故预测系统:设计、实现与效能提升
- 基于本体的大型复杂设备文本维修案例检索算法:优化与应用
- 基于有限混合模型改进算法解析西北太平洋热带气旋路径空间聚类
- 基于有限元分析的梁柱双腹板顶底角钢连接受力性能研究
- 基于最大熵模型特征选择算法的中文分词增量学习探索与实践
- 基于智能算法的A快递郴州市区配送派单优化策略研究
- 基于智能化技术的高炉生产配煤配矿决策支持系统构建与实践
- 2026重庆三峰环境集团股份有限公司招聘82人考试模拟试题及答案解析
- UOM无人机安全操控理论合格证(2026)题库+答案详解
- LW36-126型户外自能式高压六氟化硫断路器安装使用说明书
- 《人民当家作主》教学课件 - 2026-2027 学年统编版(新教材)小学道德与法治五年级上册
- 血液透析用中心静脉导管护理专家共识(2025版)
- 2026海南中考考前冲刺 英语考纲核心词汇与书面表达高级句型速览
- 2026年海战史测试题及答案
- 大学英语四级词汇表 (完美打印版)
- 私募股权投资基金基础知识全解析
- 变压器运行规定培训课件
- 清华大学出版社机械制图习题集参考答案第三版
评论
0/150
提交评论