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

下载本文档

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

文档简介

iOS开发面试核心题库及详细答案(2026最新版)适用场景:iOS初级/中级开发求职面试、日常技术复盘、笔试刷题题库说明:本题库整理互联网企业高频面试真题,涵盖Objective-C、Swift、Runtime、UIKit、多线程、内存管理、性能优化、网络与架构等核心模块,答案贴合实际开发场景,规避书面化套话,实用性极强。一、Objective-C核心基础(高频真题)1.简述OC中堆和栈的区别,日常开发中哪些对象存堆、哪些存栈?答案:栈内存由系统自动分配、自动释放,内存空间固定、读写速度快,不会产生内存泄漏。主要存储局部变量、基本数据类型变量、函数参数等。堆内存需要手动管理(MRC)或依靠ARC机制管理,空间灵活、可动态扩容,读写速度较慢,容易出现内存泄漏。所有OC对象(NSObject及其子类)全部存储在堆中。简单总结:基本类型、局部变量在栈;OC实例对象、动态分配的内存在堆。2.@property中strong、weak、copy、assign的区别及使用场景?答案:assign:直接赋值,不产生引用计数变化,不做内存管理。只用于基本数据类型(int、float、BOOL)和枚举,不能修饰对象,极易产生野指针。strong:强引用,持有对象并让引用计数+1,对象只要有强引用就不会释放。常规OC对象(UI控件、自定义对象、NSMutableArray等)默认使用,是最常用的修饰符。weak:弱引用,不改变引用计数,对象销毁后指针自动置nil,不会产生野指针。专门用于解决循环引用,常见场景:代理、block内部引用外部控制器、子控件引用父对象。copy:拷贝特性,会复制一份新对象,打破原对象的可变联动。主要用于NSString、NSArray、NSDictionary等不可变容器,防止外部可变对象修改导致属性值异常;可变对象一般不用copy,会生成不可变副本导致崩溃。3.什么是循环引用?OC中常见循环引用场景及解决方案?答案:两个或多个对象互相持有对方的强引用,导致引用计数无法归零,对象永远无法释放,造成内存泄漏,这就是循环引用。常见场景:①控制器与自定义View互相强引用;②代理属性用strong修饰;③block内部强引用外部变量,同时外部持有block;④数组、字典嵌套互相持有对象。解决方案:核心是打破强引用闭环。代理、自定义嵌套对象统一用weak修饰;block内部使用weakSelf、strongSelf搭配使用;容器对象及时清空引用。4.深拷贝和浅拷贝的本质区别?NSArray的copy和mutableCopy有什么差异?答案:浅拷贝:只复制对象指针,新旧对象指向同一块内存地址,引用计数+1,对象内容共享修改。深拷贝:重新开辟内存空间,复制对象所有内容,新旧对象完全独立,修改互不影响。NSArray场景:copy属于浅拷贝,无论原数组是否可变,拷贝后都是不可变数组,仅复制元素指针;mutableCopy属于深拷贝,拷贝后是可变数组,会复制所有元素内容,生成全新对象。二、Runtime运行时机制(面试重难点)1.简述Runtime的核心作用,日常开发中用到的Runtime场景?答案:Runtime是OC的底层核心,是一套纯C语言编写的动态库,让OC具备动态特性,所有OC的方法调用、对象创建、属性访问本质都是RuntimeC函数调用。核心作用:实现动态方法调用、动态添加/交换方法、动态添加属性、消息转发、获取类的成员变量和方法列表。日常开发场景:①MethodSwizzling方法交换(统一处理按钮点击、日志统计、防重复点击);②分类动态添加属性;③字典转模型、归档解档;④消息转发处理未实现方法,避免崩溃。2.能否向编译后的类、运行时创建的类中添加实例变量?原因是什么?答案:编译后的类不能添加实例变量。类编译注册后,结构体中的实例变量链表、内存大小已经固定,系统不会动态扩容,强行添加会导致内存错乱。运行时动态创建的类可以添加实例变量。未注册的类内存结构可动态修改,在类注册前调用class_addIvar即可完成变量添加,注册后同样无法添加。3.OC消息发送与消息转发流程?答案:1.消息发送:调用对象方法时,底层触发objc_msgSend,先通过isa指针找到类对象,遍历方法列表查找SEL对应的IMP实现,找到后直接执行方法。2.动态解析:如果未找到方法,调用resolveInstanceMethod/resolveClassMethod,可动态添加方法实现。3.快速转发:动态解析失败后,调用forwardingTargetForSelector,可将消息转发给其他对象处理。4.完整转发:快速转发失败后,调用methodSignatureForSelector生成方法签名,再调用forwardInvocation转发消息。5.全部流程失败,程序抛出unrecognizedselector崩溃。三、Swift核心知识点(2026高频考点)1.Swift中weak、unowned的区别,各自使用场景?答案:两者都是弱引用,不增加引用计数,用于解决循环引用。weak:修饰可选类型,对象销毁后指针自动置nil,使用时需要解包,安全性更高。适用于对象可能为nil、生命周期不确定的场景,如代理、临时引用。unowned:修饰非可选类型,默认假定指针永远不为nil,对象销毁后继续访问会直接崩溃,无nil容错。适用于两个对象生命周期完全绑定、必然同时存在的场景,如闭包内部引用宿主对象。2.SwiftTask和DetachedTask的核心差异?答案:Task(结构化任务):继承父任务的上下文,包括任务优先级、本地参数、执行器上下文,和父任务绑定,父任务取消后子任务同步取消,支持结构化并发,可精准管控任务生命周期。日常业务异步逻辑优先使用。DetachedTask(分离任务):完全独立执行,不继承父任务任何上下文,不受父任务取消、优先级影响,生命周期完全自主。仅用于完全独立、无需上下文关联的全局异步任务,业务开发极少使用。3.Swift协议的特点,协议扩展的优势?答案:协议是方法、属性的声明集合,不负责实现,支持类、结构体、枚举遵循,可实现多协议遵循,弥补Swift单继承的短板,遵循「组合优于继承」的设计思想。协议扩展优势:可以给协议提供默认实现,所有遵循协议的类型无需重复实现方法,统一业务逻辑,减少冗余代码;支持协议组合,灵活限定方法参数类型,提升代码复用性和扩展性。四、多线程与并发(核心难点)1.GCD中串行、并行队列,同步、异步任务的组合效果?答案:核心规律:同步任务阻塞当前线程,异步任务不阻塞;串行队列任务顺序执行,并行队列任务并发执行。1.串行队列+同步任务:顺序执行,阻塞当前线程,极易造成线程卡死;2.串行队列+异步任务:后台顺序执行,不阻塞当前线程;3.并行队列+同步任务:顺序执行,阻塞当前线程;4.并行队列+异步任务:并发执行,不阻塞当前线程,是日常耗时任务(网络、解析、读写文件)最常用组合。2.什么是死锁?GCD常见死锁场景及规避方案?答案:死锁是多个线程互相等待对方释放资源,导致所有任务永久挂起,程序卡死无响应。本质是线程资源互相占用、循环等待。常见场景:主线程中执行dispatch_sync同步任务到主队列;多个串行队列互相嵌套同步任务。规避方案:主线程禁止同步嵌套主队列任务;耗时操作全部用异步任务;避免多队列互相嵌套调用;统一线程资源调用顺序。3.简述NSOperation与GCD的区别,各自适用场景?答案:GCD是底层C语言API,轻量高效,只负责任务调度,无任务状态管理,适合简单、批量的异步耗时任务。NSOperation是GCD的上层封装(OC/Swift面向对象),自带任务状态(就绪、执行、完成、取消),支持任务依赖、优先级设置、批量取消、暂停恢复,功能更完善。适用场景:简单异步任务、一次性调度用GCD;需要任务依赖、批量管理、可取消的复杂并发场景(多文件上传、批量网络请求)用NSOperation。五、UIKit与页面生命周期1.UIViewController完整生命周期及各方法核心作用?答案:1.init:控制器初始化,初始化属性、数据;2.loadView:加载View层级,自定义View布局可重写,禁止手动调用;3.viewDidLoad:视图加载完成,唯一调用,用于初始化UI、网络请求、数据配置;4.viewWillAppear:视图即将展示,每次页面显示都会调用,用于刷新页面数据、开启定时器;5.viewDidAppear:视图完全展示,用于页面渲染完成后的后续操作;6.viewWillDisappear:视图即将消失,用于保存数据、关闭定时器、移除监听;7.viewDidDisappear:视图完全消失,用于释放临时资源;8.dealloc:控制器销毁,校验内存释放情况。2.TableView卡顿的常见原因及优化方案?答案:卡顿核心原因:主线程做耗时操作、Cell复用不彻底、视图层级复杂、图片渲染耗时、数据计算冗余。优化方案:1.彻底复用Cell,统一注册Cell,避免频繁创建视图;2.预计算Cell高度并缓存,避免实时计算高度阻塞主线程;3.图片异步加载、懒加载,裁剪图片尺寸适配Cell大小,避免超大图渲染;4.简化Cell视图层级,减少嵌套、透明图层、阴影渲染;5.分页加载数据,首屏轻量化,滑动时停止复杂计算、网络请求;6.所有耗时操作(数据解析、数据库查询)放到子线程,完成后回主线程刷新UI。3.SceneDelegate的作用及适用场景?答案:SceneDelegate是iOS13+新增的页面场景管理类,负责管理App单个场景的生命周期,包括场景创建、前台后台切换、销毁等状态。核心作用:适配多窗口、多场景功能,区分不同页面场景的生命周期,替代部分AppDelegate的页面管理职责,让职责拆分更清晰。适用场景:需要支持iPad多窗口、iPhone悬浮窗、多页面独立生命周期管理的项目。六、性能优化与内存调优(进阶面试题)1.iOS项目常见内存问题及排查优化手段?答案:常见内存问题:内存泄漏、循环引用、野指针、内存暴涨、OOM闪退。排查工具:XcodeInstruments(Leaks检测泄漏、Allocation监控内存分配、Zombies捕捉野指针)。优化手段:1.杜绝循环引用,代理、嵌套对象、block合理使用weak/unowned;2.页面销毁时移除监听、定时器、通知,清空全局引用;3.大图片、大文件及时释放,缓存设置上限,避免无限缓存;4.避免全局变量滥用,临时数据使用后及时置空;5.复用视图、控件,减少频繁创建销毁对象。2.App启动优化的核心思路?答案:App启动分为预处理、系统加载、主线程初始化、首屏渲染四个阶段,优化核心是减少主线程耗时、延迟非必要任务。1.移除冗余第三方库、废弃代码,减少编译和加载耗时;2.主线程只做UI初始化,将网络请求、数据解析、数据库初始化、日志初始化等耗时任务放入后台异步执行;3.首屏轻量化,先渲染基础框架,再异步加载业务数据和复杂UI;4.延迟初始化非首屏模块、非核心功能;5.优化图片资源,使用矢量图、压缩图,减少资源加载耗时。七、网络与数据安全1.iOS网络请求中GET和POST的核心区别?答案:1.参数传递:GET参数拼接在URL后面,公开可见;POST参数放在请求体中,相对隐蔽;2.数据长度:GET有URL长度限制,无法传输大数据;POST无明显长度限制,适合上传文件、大数据;3.缓存特性:GET请求默认可缓存,适合查询类接口;POST默认不缓存,适合提交、修改数据接口;4.用途:GET用于查询、获取数据;POST用于提交、新增、修改数据。2.移动端接口密钥、敏感数据如何安全存储?答案:1.核心密钥、接口token禁止硬编码写入代码,避免打包后被逆向获取;2.常规敏感数据使用Keychain存储,系统加密、退出登录不丢失、安全性高于UserDefaults;3.配置类密钥通过.xcconfig文件管理,加入.gitignore禁止上传代码仓库;4.关键密钥运行时动态解密,采用字节数组、异或混淆存储,不直接明文保存;5.禁止在日志、控制台打印敏感数据,防止信息泄露。八、架构与实战经验(中高级面试)1.简述MVC、MVVM的区别,MVVM的优势?答案:MVC:Model(数据)、View(视图)、Controller(控制器),Controller承担数据处理、业务逻辑、视图代理等大量工作,极易臃肿,代码耦合度高,复用性差。MVVM:在MVC基础上新增ViewModel层,剥离Controller的业务逻辑和数据处理,负责Model和View的数据绑定、逻

温馨提示

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

评论

0/150

提交评论