iOS 高频面试题及详细答案(实战版)_第1页
iOS 高频面试题及详细答案(实战版)_第2页
iOS 高频面试题及详细答案(实战版)_第3页
iOS 高频面试题及详细答案(实战版)_第4页
iOS 高频面试题及详细答案(实战版)_第5页
已阅读5页,还剩2页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iOS高频面试题及详细答案(实战版)一、Swift基础语法&核心特性1.Swift中let和var的区别?底层原理是什么?答案:let定义常量,var定义变量。表层区别:let修饰的变量初始化后值不可修改,var可以随时修改let性能优于var,编译期会做常量优化,开发中优先使用let底层原理:Swift编译时会对let常量做内存锁定,栈区常量内存不可重写,编译器会提前校验赋值唯一性,杜绝二次修改。对于结构体、枚举值类型,let完全锁定值;对于类引用类型,let仅锁定引用地址,对象内部属性依然可以修改。2.Swift结构体和类的核心区别?实际开发如何选择?答案:核心区别:结构体:值类型,存储在栈区,赋值、传参都是值拷贝,无引用计数,线程安全类:引用类型,存储在堆区,赋值仅拷贝指针地址,有ARC引用计数,存在循环引用风险结构体不支持继承,类支持继承、多态、重写结构体默认成员初始化器,类需要手动实现构造器开发选择原则:纯数据模型、简单数据结构、需要线程安全、无需继承的场景用结构体;需要复用逻辑、继承关系、对象统一管理、生命周期控制的场景用类。日常开发中,网络数据模型、配置模型基本全部用Struct。3.Optional可选类型的本质?!和?的区别答案:Optional本质是枚举,包含casesome(包装值)、casenone(空值),是Swift为了解决空指针崩溃设计的语法特性。区别:?:表示变量可空,使用时需要解包,安全级别高,不会主动崩溃!:强制解包,告诉编译器当前值一定不为空,一旦为空直接崩溃,日常开发尽量避免使用常规安全写法:可选绑定iflet、guardlet、空合运算符??,杜绝强制解包。4.guard和iflet的区别和使用场景答案:iflet:在当前代码块内解包使用,适合局部判断、多个独立可选值处理guardlet:解包后全局作用域可用,必须带else分支且必须终止流程(return/break/throw),用于提前校验参数、拦截非法数据,扁平化代码,减少嵌套开发规范:参数校验、前置条件判断优先用guard,简单空值判断用iflet。二、内存管理&ARC机制1.ARC原理是什么?什么时候会触发内存泄漏?答案:ARC是自动引用计数机制,编译器在编译阶段自动插入retain、release、autorelease代码,无需手动管理内存。对象引用计数为0时,系统自动销毁对象、回收堆内存。常见内存泄漏场景:循环引用:两个对象互相强引用,引用计数无法归零闭包捕获外部对象,未使用weak/self,造成闭包持有对象NSTimer、CADisplayLink强持有控制器/视图,未及时销毁全局变量、单例持有临时对象2.weak、unowned、strong的区别答案:strong:默认修饰,强引用,引用计数+1,对象不会被释放,极易造成循环引用weak:弱引用,不增加引用计数,对象销毁后指针自动置nil,安全,多用于代理、闭包unowned:无主引用,不增加引用计数,对象销毁后指针不置空,再次访问直接野指针崩溃,性能略优于weak,仅用于确定对象生命周期一定长于自身的场景日常开发优先用weak,禁止随意使用unowned。3.闭包循环引用如何解决?答案:核心原理:打破互相强引用的关系。两种解决方案:捕获列表使用[weakself],闭包内部可选解包,对象销毁后self为nil,不会崩溃必要场景使用[unownedself],需保证闭包执行期间self一定存在开发标准写法:网络请求、回调闭包统一使用[weakself]。三、多线程&GCD核心面试题1.GCD队列和任务的区别?串行、并行队列区别答案:队列是存放任务的容器,负责调度任务;任务是具体要执行的代码块。串行队列:同一时间只执行一个任务,任务按顺序排队执行,线程唯一并行队列:同一时间可开启多个线程,同时执行多个任务,任务执行顺序不确定核心注意:队列特性+任务执行方式共同决定执行逻辑,异步函数在串行队列也只会单线程顺序执行。2.sync和async的区别?死锁原理答案:async:异步执行,不阻塞当前线程,直接返回,开启新线程执行任务sync:同步执行,阻塞当前线程,等待任务执行完成后才返回死锁核心:当前串行队列正在等待自己的同步任务执行完成,互相等待,线程卡死。经典死锁场景:主线程中调用DispatchQueue.main.sync嵌套任务;串行队列内部嵌套当前队列的同步任务。3.GCD栅栏函数、延时函数、一次性函数使用场景答案:dispatch_once:保证代码全局只执行一次,用于单例创建、全局配置初始化,线程安全dispatch_after:延时执行,不阻塞主线程,用于延时弹窗、动画延迟执行dispatch_barrier_async:栅栏函数,并行队列中,等待前面所有任务执行完毕,再执行栅栏任务,结束后再执行后续任务,用于读写分离,解决多线程数据读写冲突4.主线程和子线程分工原则答案:主线程:只负责UI刷新、页面跳转、用户交互响应,禁止耗时操作子线程:处理所有耗时操作,网络请求、文件读写、数据解析、图片渲染、数据库操作,耗时结束后切回主线程刷新UI四、UI框架&布局原理1.UIView和CALayer的区别答案:UIView:继承自UIResponder,具备事件响应、手势交互能力,是界面可视交互载体CALayer:负责内容绘制、渲染、动画,不处理触摸事件,无交互能力所有UIView内部都自带一个CALayer,UIView负责交互,CALayer负责渲染显示日常动画、圆角、阴影、边框优化,都是操作CALayer属性。2.AutoLayout约束核心原理?约束冲突、约束冗余原因答案:AutoLayout通过添加位置、尺寸约束,让系统自动计算控件frame,适配不同屏幕。核心是通过足够的约束确定控件的X、Y、宽、高四个值。约束冲突:同一方向约束相互矛盾,比如同时设置左右边距0和固定宽度,条件冲突约束冗余:约束数量超出所需,多余约束不影响布局,但会增加布局计算开销,控制台会打印警告3.圆角优化的方案,解决离屏渲染卡顿答案:常规写法layer.cornerRadius+masksToBounds会触发离屏渲染,大量列表复用会造成卡顿。优化方案:使用贝塞尔曲线裁剪图片,避免masksToBounds绘图绘制圆角视图,直接渲染使用UIBezierPath+CAShapeLayer绘制圆角,无离屏渲染静态图片提前切圆角,代码层面不做实时裁剪五、性能优化&卡顿优化1.APP卡顿的根本原因?iOS帧率机制答案:iOS屏幕刷新率固定60帧/秒,每帧渲染时间约16ms。主线程在16ms内未完成UI渲染、布局、绘制、事务提交,就会丢帧,产生卡顿。卡顿主要诱因:主线程耗时操作、大量图层渲染、离屏渲染、约束重复计算、列表复用不当、大量日志打印。2.UITableView卡顿优化方案答案:开启cell复用机制,杜绝频繁创建cell提前计算cell高度,缓存高度,避免实时动态计算减少cell内部图层数量,合并视图,减少嵌套优化圆角、阴影,规避离屏渲染异步加载图片、异步解析数据,主线程只做赋值刷新滑动时停止耗时操作,滑动结束后再加载数据3.内存泄漏检测和日常优化手段答案:检测工具:XcodeInstruments(Leaks、Zombies)、DebugMemoryGraph内存图谱优化手段:闭包统一使用weak捕获对象定时器、手势、通知在页面销毁时移除避免全局变量随意持有临时对象大图及时释放、缓存上限控制六、网络&项目实战1.URLSession和AFNetworking的关系答案:URLSession是iOS原生网络请求底层框架,负责底层网络通信;AFNetworking是基于URLSession封装的三方框架,简化请求封装、参数拼接、响应解析、异常处理、证书验证等逻辑,是项目主流网络方案。2.网络请求常见优化和容错方案答案:统一封装请求基类,统一处理超时、重试、状态码判断、弹窗提示添加超时时间、请求重试机制、弱网/无网判断重复请求拦截,避免短时间多次点击发起多个相同请求数据缓存,离线读取缓存数据,提升体验异常统一拦截,token过期自动刷新、自动登出七、OC&Swift混编&底层基础1.Swift调用OC、OC调用Swift如何实现?答案:Swift调用OC:配置桥接文件(xxx-Bridging-Header.h),导入OC头文件即可直接使用OC调用Swift:无需手动导入,系统自动生成工程名-Swift.h文件,OC导入该文件,Swift类需加@objc、dynamic暴露给OC2.栈区和堆区的区别答案:栈区:系统自动分配、自动回收,速度快,容量小,存储值类型、局部变量堆区:手动管理(ARC自动回收),速度慢,容量大,存储引用类型对象栈区内存随函数执行结束立即释放,堆区内存需要引用计数归零后才会释放。八、常见面试手写题1.Swift单例标准写法答案:swift

classSingleManager{

staticletshared=SingleManager()

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论