iOS开发面试题集及详细答案(完整版)_第1页
iOS开发面试题集及详细答案(完整版)_第2页
iOS开发面试题集及详细答案(完整版)_第3页
iOS开发面试题集及详细答案(完整版)_第4页
iOS开发面试题集及详细答案(完整版)_第5页
已阅读5页,还剩5页未读, 继续免费阅读

下载本文档

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

文档简介

iOS开发面试题集及详细答案(完整版)本套面试题汇总一线互联网公司iOS高频面试题型,包含Swift基础、OC底层、UI框架、多线程、内存管理、性能优化、项目实战、网络、组件化等核心模块,答案贴合实际开发场景,通俗易懂、无书面化冗余内容,适配初级、中级iOS开发面试。一、Swift基础语法与核心特性1、Swift中let和var的区别?答案:let定义常量,赋值后不可修改,必须初始化赋值,底层是只读内存。var定义变量,赋值后支持多次修改,可先声明后赋值。核心细节:引用类型中,let修饰的对象,对象地址不可变,但内部属性如果是var可以修改;var修饰的对象,地址和内部可变属性均可修改。2、Swift可选类型Optional原理及解包方式?答案:可选类型用于处理值缺失的场景,本质是枚举,包含casesome(T)、casenone两种状态,用来解决空值问题,避免野指针崩溃。常见解包方式:强制解包!:强制解析可选值,为空时直接崩溃,仅确定非空时使用。可选链式?:值为空时返回nil,不崩溃,适合多层级调用。iflet/guardlet安全解包:最常用,判断非空后执行逻辑,安全无崩溃。默认值解包??:为空时返回默认值,简化空值兜底逻辑。3、Swift结构体和类的区别?答案:存储方式:结构体是值类型,存储在栈区;类是引用类型,存储在堆区,栈中仅存储对象地址。赋值逻辑:结构体赋值是值拷贝,新旧对象互不影响;类赋值是地址拷贝,多个变量指向同一个对象。继承特性:结构体不支持继承、不支持重写;类支持继承、方法重写、多态。构造器:结构体默认自带逐一成员构造器;类需要手动实现构造器,无默认逐一构造器。析构函数:结构体无deinit析构方法;类有deinit,对象销毁时自动调用。4、Swift中static和class的区别?答案:static:修饰静态属性、静态方法,归属于当前类型,不可被子类重写,结构体、枚举、类均可使用。class:仅可修饰类的静态方法/计算属性,允许子类重写,结构体和枚举无法使用。5、Swift闭包循环引用的产生及解决方式?答案:产生原因:当前对象持有闭包,闭包内部又强引用当前对象,双方互相持有,引用计数无法归零,导致内存泄漏。解决方案:weak弱引用:适用于对象可能提前销毁的场景,指针为空时自动置nil,安全无崩溃。unowned无主引用:适用于对象生命周期和闭包完全一致的场景,不置nil,性能更高,为空会崩溃。常规写法:[weakself]、[unownedself]捕获列表修饰闭包。二、OC底层与混编核心1、OC引用计数原理?MRC和ARC区别?答案:OC内存管理核心是引用计数,对象初始化时retainCount=1,每retain一次计数+1,release一次计数-1,计数为0时系统调用dealloc销毁对象。MRC(手动内存管理):需要开发者手动编写retain、release、autorelease代码,把控对象生命周期,容错率低,现已淘汰。ARC(自动内存管理):编译器在编译阶段自动插入内存管理代码,无需手动管理,核心规则:谁创建谁释放,自动处理计数增减,仅需处理循环引用问题。2、OC中strong、weak、assign、copy区别?答案:strong:强引用,默认属性修饰符,持有对象,引用计数+1,对象不会被释放,适用于大部分对象类型。weak:弱引用,不持有对象,引用计数不变,对象销毁后指针自动置nil,主要用于解决循环引用(代理、闭包)。assign:直接赋值,不修改引用计数,指针悬空不置空,仅用于基本数据类型、枚举、结构体,不可修饰对象。copy:拷贝修饰,分为深拷贝、浅拷贝。不可变字符串用copy防止外部修改数据源;可变对象必须用mutableCopy,开辟新内存存储数据,避免原数据被篡改。3、OC消息转发机制?完整流程?答案:OC是动态语言,方法调用本质是发送消息objc_msgSend,当对象未实现对应方法时,不会直接崩溃,会走消息转发流程,流程分三步:动态方法解析:调用resolveInstanceMethod,动态添加未实现的方法。备用接收者:调用forwardingTargetForSelector,将消息转发给其他对象处理。完整消息转发:调用methodSignatureForSelector、forwardInvocation,手动自定义消息处理逻辑。三步全部失败后,程序触发崩溃。该机制是OC动态绑定、方法交换、热修复的底层基础。4、Swift与OC混编注意事项?答案:OC调用Swift:系统自动生成Swift头文件(项目名-Swift.h),引入后即可调用,Swift类需继承NSObject、添加@objc修饰暴露方法。Swift调用OC:创建Bridging-Header桥接文件,引入OC头文件,直接全局调用。注意点:Swift枚举、结构体无法直接被OC识别,需改为类、添加@objc;Swift泛型、高阶函数不兼容OC,混编需规避。三、UI框架与界面渲染1、UIKit渲染流程?layout、display区别?答案:iOS界面渲染分为两大核心流程,均在主线程执行:1、Layout布局阶段(计算尺寸位置):触发方法:layoutSubviews作用:计算控件frame、约束布局,仅修改位置尺寸,不绘制画面。2、Display绘制阶段(渲染画面):触发方法:drawRect作用:通过CoreGraphics绘制图形、文字、图片,生成图层内容。刷新规则:setNeedsLayout标记布局刷新,setNeedsDisplay标记绘制刷新,均为异步刷新,不会立即执行。2、AutoLayout约束报错、冲突的常见原因及解决?答案:常见原因:约束冗余:同一控件重复添加宽高、位置约束,系统无法择优。约束冲突:横向/纵向约束逻辑矛盾,比如同时约束左距10、右距100,宽度固定50。缺少约束:控件无完整约束,无法确定位置尺寸。解决方式:删除冗余约束、补齐缺失约束、调整冲突逻辑;利用约束优先级、placeholder约束适配动态布局。3、CALayer和UIView的区别与联系?答案:联系:UIView内部封装了CALayer,UIView负责交互事件处理,CALayer负责画面渲染展示。区别:功能:UIView支持点击、手势、事件响应;CALayer仅负责绘制、动画、样式,无交互能力。属性:CALayer拥有阴影、圆角、边框、3D变换等渲染属性,UIView无原生渲染属性。继承:UIView继承自UIResponder;CALayer继承自NSObject。4、UITableView卡顿优化方案?答案:核心优化思路:减少主线程计算、减少图层渲染开销、复用单元格。单元格复用:严格使用dequeueReusableCell,避免频繁创建cell。预计算高度:提前缓存cell高度,避免cellForRow中动态计算。减少图层渲染:避免cell阴影、圆角、重叠图层,必要时开启shouldRasterize光栅化缓存图层。异步加载:图片解码、数据解析、富文本渲染放到子线程,主线程仅赋值刷新。减少刷新次数:批量刷新数据,避免单行频繁reload;使用beginUpdates/endUpdates包裹刷新逻辑。优化控件层级:减少cell内部嵌套控件数量,简化布局逻辑。四、多线程与GCD1、GCD队列类型、任务类型区别?答案:队列分为两种:串行队列:任务按顺序执行,同一时间仅一个任务运行,适合有序、线程安全逻辑。并发队列:任务同时执行,开启多个子线程,无序执行,适合耗时并行任务。任务分为两种:同步任务sync:阻塞当前线程,等待任务执行完毕后,才执行后续代码,不开启新线程。异步任务async:不阻塞当前线程,直接执行后续代码,会开启新线程(并发队列)。重点:主队列是特殊串行队列,所有UI操作必须在主队列执行。2、GCD死锁产生条件及场景?答案:死锁核心条件:当前队列等待同步执行当前队列的任务,线程互相阻塞,无法继续执行。经典死锁场景:主线程中执行dispatch_sync同步任务到主队列,主线程等待任务完成,任务等待主线程空闲,互相阻塞触发死锁。规避方案:主队列禁止同步嵌套主队列任务;串行队列避免同步嵌套自身队列任务。3、GCD栅栏函数、信号量作用?答案:栅栏函数dispatch_barrier:用于并发队列中,隔离读写任务,栅栏前任务全部执行完毕后,才执行栅栏任务,栅栏任务完成后,再执行后续任务,解决多线程读写竞争问题。信号量dispatch_semaphore:用于控制线程最大并发数、线程同步、资源互斥访问。通过信号量计数控制线程执行,计数大于0放行,等于0阻塞,常用于接口并发限制、数据读写加锁。4、NSOperation与GCD对比?答案:GCD:底层C语言封装,轻量高效,适合简单多线程任务,无任务状态管理、无依赖控制。NSOperation:基于GCD封装的OC面向对象框架,支持任务暂停、取消、继续、任务依赖、最大并发数设置,适合复杂多线程任务管理(批量下载、批量解析)。五、内存管理与性能优化1、iOS常见内存泄漏场景及排查方式?答案:常见泄漏场景:循环引用:页面self强引用闭包、代理未用weak、双向数据强引用。全局变量常驻内存,页面退出未清空。定时器NSTimer强引用target,未及时销毁。通知、KVO注册后未移除,残留观察者。排查工具:XcodeInstruments(Leaks)、DebugMemoryGraph、MLeaksFinder。2、NSTimer为什么会内存泄漏?解决方案?答案:泄漏原因:NSTimer会强引用target,当前页面又强引用timer,双方循环持有,页面无法释放。解决方案:页面销毁前手动invalidate销毁定时器,置空timer。使用中间代理弱引用target,打破循环引用。使用GCD定时器替代NSTimer,无需手动销毁,自动释放。3、App启动优化方案?答案:App启动分为冷启动、热启动,优化核心是缩短main函数前后耗时。main函数前优化:减少动态库数量、删除无用编译代码、优化PCH文件、减少类和方法加载数量。main函数后优化:将耗时初始化(第三方SDK、数据预加载、数据库初始化)放到子线程。首页优化:延迟加载非首页资源、简化首页布局、预缓存页面数据。二进制重排:优化启动页符号加载顺序,减少缺页中断耗时。4、iOS卡顿、掉帧原因及优化?答案:屏幕刷新率60fps,每帧渲染时间需控制在16ms以内,超过则卡顿掉帧。卡顿核心原因:主线程阻塞、UI渲染耗时、图层叠加过多。优化方案:所有耗时操作(网络、解析、文件读写)放入子线程。减少图层混合、离屏渲染,规避大量圆角、阴影、透明度叠加。优化列表滑动,预加载数据、缓存视图和高度。精简主线程代码,避免复杂计算和循环。六、网络与数据处理1、HTTP与HTTPS区别?HTTPS加密原理?答案:区别:HTTP明文传输、无加密、端口80、不安全、易被抓包篡改;HTTPS基于HTTP+SSL/TLS加密、端口443、数据加密传输、防篡改防窃听。加密原理:采用对称加密+非对称加密结合。非对称加密协商对称密钥,对称加密传输业务数据,兼顾安全性和传输效率。2、AFNetworking核心原理?答案:AFNetworking基于系统NSURLSession二次封装,核心分为三大模块:会话管理:AFHTTPSessionManager管理请求会话,统一配置请求头、超时、证书。参数序列化:自动处理JSON、表单、URL参数拼接,规避参数格式错误。响应序列化:自动解析后台返回数据,统一错误处理、状态码判断。同时封装了网络状态监听、断点续传、HTTPS证书校验、请求取消等能力。3、网络重试、弱网、断网适配方案?答案:断网适配:监听系统网络状态,无网络时拦截请求,弹出无网络提示,缓存离线请求,联网后重试。弱网适配:延长请求超时时间、限制并发请求数量、精简请求参数。重试机制:封装请求重试逻辑,针对5xx、网络波动错误,自动重试2-3次,避免偶发请求失败。七、项目实战与架构1、MVC、MVVM架构区别?各自优缺点?答案:MVC:Model(数据)、View(界面)、Controller(控制器)。控制器负责数据处理、业务逻辑、视图代理,适合小型项目;缺点是控制器臃肿、耦合度高、难以维护、单元测试困难。MVVM:Model、View、ViewModel。ViewModel承接控制器所有业务逻辑、数据转换,View和ViewModel双向绑定,控制器轻量化。优点是解耦彻底、代码复用率高、支持单元测试、适合中大型项目;缺点是学习成本高、绑定逻辑复杂、新手易滥用。2、iOS组件化实现方案?答案:组件化核心是解耦业务模块,将项目拆分为登录、首页、个人中心、支付等独立组件,组件间禁止直接依赖调用。主流方案:路由跳转:基于URL路由实现页面跳转,通过路由中间件统一调度模块。协议注册:通过Protocol协议注册、服务匹配,实现组件间方法调用。私有库管理:将独立组件打包为CocoaPods私有库,单独维护、单独迭代。3、APP降级、防崩溃实战方案?答案:防崩溃:空值防护:数组、字典、字符串空值判断,避免越界、空对象调用。异常捕获:全局捕获崩溃异常、try-catch拦截已知异常。类型校验:接口数据强校验,

温馨提示

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

最新文档

评论

0/150

提交评论