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

下载本文档

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

文档简介

iOS开发高频面试题及详细答案(实战向)一、Swift基础语法核心面试题1.说说Swift中struct和class的核心区别这是Swift最基础也是必问的知识点,核心区别集中在存储方式、继承、生命周期和特性上:1.存储与赋值机制不同:struct是值类型,存储在栈区,赋值、传参时会完全拷贝一份新数据,新旧对象互不影响;class是引用类型,存储在堆区,变量仅存储对象内存地址,多个变量指向同一个内存,修改一个会影响所有指向它的变量。2.继承特性不同:结构体不支持继承,无法创建子类;类支持单继承,可以层层派生,复用父类属性和方法。3.构造规则不同:结构体默认会自动生成逐一成员构造器,就算自定义构造器也不会覆盖默认构造器;类默认无空构造器,自定义构造器后会覆盖系统默认构造器,如需保留默认构造器需手动实现。4.析构与引用计数:结构体没有deinit析构方法、无ARC引用计数机制;类有deinit析构方法,依靠ARC管理内存,有引用计数增减逻辑。5.可变特性:结构体修改自身属性必须用mutating修饰方法;类的方法修改属性无需额外修饰。2.Swift中let和const、staticlet的区别很多开发者容易混淆三者的作用域和特性,实际开发中分工明确:1.let:定义常量,内存地址不可变,如果是值类型,数值完全不可修改;如果是引用类型,对象地址不变,但对象内部的可变属性可以修改。属于实例级别常量,必须在实例初始化时赋值。2.staticlet:静态常量,属于类型本身,不属于实例,全局唯一,无需创建对象即可调用。天然线程安全,支持懒加载,首次调用时才初始化,常用语定义全局常量、配置参数。3.const(OC):Swift中无原生const,对应OC的const修饰全局变量,作用是编译期常量,内存常驻,不可修改。Swift中staticlet可完全替代其功能,且安全性更高。3.解释Swift可选型Optional、?和!的区别与使用场景可选型是Swift解决空指针崩溃的核心设计,本质是枚举,包含none和some两个成员:1.?可选绑定:表示变量可以有值,也可以为nil。使用时需要解包,常用iflet、guardlet、可选链式调用解包,安全无崩溃风险,是开发中首选写法。适用于值可能为空的场景,比如接口返回数据、用户可选输入内容。2.!隐式解包:变量初始化后默认非空,无需手动解包直接使用。但如果值为nil时强行调用会直接崩溃,风险极高。仅适用于变量初始化后绝对不会为空的场景,比如控制器的view、Storyboard/xib绑定的控件。核心原则:能使用?绝不使用!,隐式解包仅用于确定非空的固定场景。4.Swift闭包的循环引用问题及解决方案闭包会捕获外部变量,默认强引用捕获,如果控制器、View持有闭包,闭包又持有当前对象,就会形成循环引用,导致页面无法释放、内存泄漏。解决方案:1.弱引用捕获[weakself]:最常用方案,self变为可选型,闭包执行期间self可能为nil,不会强持有对象,页面可正常释放。适用于大部分网络请求、回调闭包场景。2.无主引用捕获[unownedself]:self为非可选型,假定闭包执行时self一定存在,性能略优于weak。如果self提前销毁,调用会崩溃,仅用于闭包生命周期和对象生命周期完全一致的场景。3.临时解包:配合guardlet使用,规避weak带来的可选值问题,代码更整洁。二、iOSUI与布局面试题1.Frame和AutoLayout的核心区别,各自优缺点1.Frame:基于绝对坐标布局,通过设置控件的x、y、width、height确定位置和尺寸。优点:逻辑简单、渲染高效,底层直接操作CALayer,无约束计算开销;适合固定尺寸、固定位置的控件,比如弹窗、自定义小控件。缺点:适配性极差,不同屏幕尺寸、横竖屏切换需要手动计算坐标;代码冗余,多人协作维护成本高,复杂页面极易出现布局错乱。2.AutoLayout:基于相对约束布局,通过控件之间的相对关系(上下左右、宽高、居中)确定布局。优点:适配性极强,一套代码适配所有iPhone、iPad屏幕,支持横竖屏、动态尺寸变化;代码可读性高,复杂页面布局逻辑清晰。缺点:有约束计算开销,大量约束会轻微影响页面渲染性能;约束冲突、冗余会导致布局异常,排查问题相对麻烦。2.AutoLayout约束冲突、冗余的原因及解决办法1.约束冗余:给控件添加了重复、可互相推导的约束,比如同时设置左右间距和宽度,系统可自动计算,多余的约束即为冗余,不会崩溃,但会打印警告,降低布局性能。解决方式:删除多余可推导的约束,保证布局逻辑唯一。2.约束冲突:添加的约束互相矛盾,比如同时设置控件宽度为100和200、左右间距固定且宽度自适应,系统无法满足所有约束,导致布局错乱、控制台报错。解决方式:排查冲突约束,删除不合理约束,调整约束优先级,确保约束逻辑自洽。3.UIView和CALayer的区别与关系这是UI底层高频问题,核心是职责分层:1.职责不同:UIView是视图载体,负责响应触摸、点击、滑动等用户交互,处理手势、事件传递;CALayer是图层,负责页面渲染、绘制内容、展示视觉效果(圆角、阴影、边框、渐变),不处理任何交互。2.层级关系:每一个UIView内部都默认绑定一个CALayer(layer属性),View是Layer的管理者,所有UI的视觉展示本质都是Layer的渲染结果。3.特性差异:CALayer可以脱离UIView单独使用,支持3D变换、隐式动画;UIView依赖CALayer才能展示内容,所有动画、样式修改最终都是操作Layer。4.性能差异:直接操作Layer比操作View更高效,自定义绘制、动画开发中优先操作Layer。三、多线程与并发面试题(高频重点)1.GCD队列类型、任务类型区别,串行、并行队列的执行逻辑GCD是iOS核心并发方案,核心分为队列和任务两大模块:队列类型1.串行队列(Serial):队列内任务按添加顺序依次执行,同一时间仅执行一个任务,任务排队执行。主队列是系统唯一的全局串行队列,所有UI刷新必须在主队列执行。2.并行队列(Concurrent):队列内任务可同时并发执行,系统自动开启多条线程调度任务,无需等待上一个任务完成即可执行下一个。系统全局队列、自定义并行队列都属于此类。任务类型1.同步任务(sync):阻塞当前线程,必须等待任务执行完毕,代码才会继续往下走,不开启新线程。2.异步任务(async):不阻塞当前线程,任务异步执行,代码立即往下走,会开启新线程(主队列异步除外)。核心组合逻辑串行+同步:顺序执行,无新线程;串行+异步:顺序执行,开启新线程;并行+同步:顺序执行,不开启新线程;并行+异步:并发执行,开启多条新线程。2.为什么主队列同步任务会卡死?(死锁原理)死锁的核心是线程互相等待,彼此阻塞。主线程本身在执行代码,此时在主线程中调用主队列sync同步任务:主队列是串行队列,需要等待当前主线程的现有代码执行完毕才能执行新任务;而sync同步特性会阻塞当前主线程,等待新任务执行完毕。两者互相等待,线程永久阻塞,直接造成页面卡死。总结:绝对禁止在主队列执行同步任务,所有主队列任务统一使用async异步执行。3.GCD栅栏函数、延时函数、一次性函数的使用场景1.栅栏函数barrier:用于并行队列,拦截前后任务。栅栏前的任务全部执行完,再执行栅栏任务,栅栏任务完成后,再执行后续所有任务。主要用于解决多线程读写安全问题,多读单写场景专用,比锁性能更高。2.延时函数after:指定时间后异步执行任务,不阻塞当前线程。替代传统定时器,适合延时弹窗、延时刷新、倒计时等场景,无需手动管理定时器生命周期。3.一次性函数once:任务在程序生命周期内仅执行一次,天然线程安全。常用于单例创建、全局配置初始化、开关初始化等场景,避免重复初始化。4.iOS线程锁的种类及选型(性能、场景对比)开发中常用锁分为以下几种,选型核心看性能和使用场景:1.os_unfair_lock:系统底层互斥锁,性能最高,等待时不自旋、直接休眠,适配iOS10+,优先推荐使用,适合绝大多数线程安全场景。2.pthread_mutex:跨平台互斥锁,性能次之,支持递归锁、条件锁,适配所有iOS版本,兼容性强。3.NSLock/NSRecursiveLock:OC封装的锁,使用简单,NSRecursiveLock支持递归调用,适合嵌套加锁场景,性能略低于底层锁。4.@synchronized:语法级锁,使用最简单,无需手动加锁解锁,但性能最差,底层封装了递归锁,适合简单、低频次的加锁场景,高频读写不推荐。四、内存管理与性能优化面试题1.ARC原理,什么是引用计数?增减规则是什么?ARC是自动引用计数内存管理机制,编译器在编译阶段自动插入retain、release、dealloc代码,无需开发者手动管理内存,核心依靠引用计数判断对象是否需要销毁。引用计数规则:1.对象创建时,引用计数初始为1;2.被强引用指向时,引用计数+1;3.强引用断开(变量置空、页面销毁、出作用域)时,引用计数-1;4.引用计数降为0时,系统自动调用dealloc销毁对象,回收内存。2.强引用、弱引用、无主引用的区别1.强引用strong:默认引用类型,持有对象,让对象引用计数+1,只要有强引用指向,对象就不会销毁。日常开发中绝大部分属性都是强引用。2.弱引用weak:不持有对象,引用计数不变化,仅记录对象地址。对象销毁后,弱引用变量自动置空,不会产生野指针,主要用于解决循环引用(代理、闭包、控件)。3.无主引用unowned:和弱引用类似,不持有对象,但对象销毁后不会自动置空,强行调用会崩溃。性能略高于weak,仅用于生命周期完全同步的对象引用场景。3.常见内存泄漏场景及排查、修复方案高频泄漏场景:1.闭包未加弱引用捕获,控制器被闭包强持有;2.代理属性用strong修饰,未用weak,双向强引用造成循环引用;3.定时器NSTimer、CADisplayLink强持有控制器,未及时销毁;4.全局静态变量持有页面、临时对象,导致对象无法释放;5.通知、KVO未移除,页面销毁后仍被监听持有。排查方案:使用XcodeMemoryGraph查看内存对象引用关系,筛选未释放的对象;使用Instruments的Leaks工具精准定位泄漏代码位置。修复方案:代理、闭包统一用weak修饰/捕获;定时器、通知、KVO在页面销毁时主动移除;避免全局变量持有临时页面对象。4.页面卡顿的原因及优化方案iOS页面渲染帧率标准为60帧/秒,每帧渲染时间需控制在16ms以内,超出即会卡顿。卡顿核心原因是主线程耗时操作过多、UI渲染耗时过长。常见卡顿原因:1.主线程执行网络请求、数据解析、文件读写、大量计算等耗时操作;2.列表Cell复用不当、Cell内控件过多、重复绘制;3.大量圆角、阴影、渐变等离屏渲染操作;4.页面刷新频繁、约束冗余计算、手势回调耗时。优化方案:1.所有耗时异步操作(网络、解析、计算)移至子线程,结果回调主线程刷新UI;2.列表开启复用机制,预加载Cell,缓存固定样式Cell,减少动态创建;3.规避离屏渲染:圆角优先用贝塞尔曲线裁剪,阴影设置shadowPath,减少动态渐变;4.精简页面控件,减少冗余约束,批量刷新UI,避免频繁setNeedsLayout;5.使用Instruments的CoreAnimation、TimeProfiler工具定位卡顿代码。五、网络与数据持久化面试题1.URLSession的工作机制,和旧版NSURLConnection的区别URLSession是iOS7之后替代NSURLConnection的网络请求框架,是目前主流网络请求方案。核心区别:1.NSURLConnection是同步阻塞请求,接口简陋,不支持断点续传、后台下载,已废弃;2.URLSession基于异步设计,支持后台下载、断点续传、批量请求、请求缓存配置,功能更全面;3.URLSession支持任务暂停、取消、恢复,可精准管控请求生命周期,适配复杂网络场景。URLSession分为三种任务类型:数据任务(普通接口请求)、下载任务(文件下载)、上传任务(文件上传)。2.网络缓存策略、GET/POST区别GET与POST核心区别:1.参数位置:GET参数拼接在URL后面,明文展示;POST参数放在请求体中,相对安全。2.缓存机制:GET请求默认可被系统缓存,POST默认不缓存;3.数据长度:GET有URL长度限制,无法传输大数据;POST无长度限制,适合文件上传、大量参数传输。4.用途:GET用于查询数据,无副作用;POST用于提交、修改、新增数据,有业务副作用。网络缓存策略:优先使用协议缓存(Cache-Control、ETag),手动配置URLSession缓存规则;热点数据本地沙盒缓存,减少重复请求,提升加载速度。3.iOS常用数据持久化方案及选型1.UserDefaults:轻量级持久化,适合存储简单配置、开关、用户基础信息。缺点:不适合存储大量数据、模型数据,读写性能一般,数据同步有延迟。2.Plist文件:存储数组、字典等基础数据,结构简单,读写便捷,适合静态配置数据,不支持自定义模型、不支持大数据。3.归档(NSCoding):支持自定义模型持久化,可序列化对象,适合存储少量自定义数据,缺点是增删改查效率低。4.SQLite/FMDB:轻量级数据库,支持事务、增删改查、条件查询,适合大量结构化数据存储,比如列表缓存、本地数据台账。5.Realm:移动端高性能数据库,语法简洁、读写速度快,支持跨平台,替代FMDB的主流方案。六、项目实战与底层原理面试题1.iOS事件传递与响应链机制事件传递(从上到下):用户点击屏幕后,系统先找到当前点击的Window,再从Window逐级向下遍历子视图,通过hitTest判断当前控件是否可以响应事件、点击点是否在控件范围内,最终找到最合适的响应控件。事件响应(从下到上):找到目标控件后,优先由目标控件响应事件,如果控件不响应,逐级向上传递给父视图、控制器、Window、AppDelegate,直至找到响应者,无人响应则事件废弃。核心方法:hitTest(_:with:)寻找最优响应视图,point(inside:with:)判断点击点是否在视图内。2.说说你对iOS页面渲染流程的理解页面渲染分为三个核心步骤,全部在

温馨提示

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

评论

0/150

提交评论