版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOSBAT高频面试题及详细答案(实战口语版)一、Objective-C基础核心题1.讲讲OC中的消息机制,objc_msgSend执行流程OC是动态语言,方法调用本质就是给对象发送消息,核心函数是objc_msgSend,整个流程分三步,面试里重点说查找和动态决议:第一步:消息发送。调用方法时,编译器会把方法调用转成objc_msgSend(对象,方法SEL,参数),首先判断对象是否为空,空对象直接返回,不崩溃。然后从对象的类缓存里查找方法,缓存命中就直接执行方法实现。第二步:未命中缓存,走类方法列表查找。先查当前类的方法列表,遍历匹配SEL,找到后存入缓存再执行;当前类找不到,就顺着父类链,一直查到根类NSObject。第三步:动态方法决议。如果整个继承链都没找到方法,不会直接崩溃,会开启补救流程。首先调用resolveInstanceMethod,允许动态添加方法实现;决议失败后,进入消息转发,先尝试快速转发forwardingTargetForSelector,转发给其他对象处理;快速转发无效,再走慢速转发methodSignatureForSelector和forwardInvocation。所有流程走完还是没有有效实现,才会报unrecognizedselector崩溃。2.分类(Category)和扩展(Extension)的区别,分类能不能加属性?核心区别:1.编译时机不同:扩展是编译时的,必须和原类同一源码文件,相当于类的私有补充;分类是运行时的,可以跨文件、跨模块给原有类扩充功能。2.内容限制不同:扩展可以添加成员变量、属性、方法;分类只能添加方法,不能直接添加成员变量。3.优先级不同:分类方法会覆盖原类同名方法(不推荐),多个分类有同名方法,最后编译的分类方法生效;扩展没有覆盖逻辑。分类能否加属性:可以声明属性,但不会自动生成成员变量和getter/setter实现,只会生成方法声明。如果要让分类属性生效,必须通过runtime的关联对象objc_setAssociatedObject、objc_getAssociatedObject手动实现存取方法,本质是动态绑定数据,不是真正的成员变量。3.load和initialize方法的区别、调用时机、使用场景load方法:1.调用时机:类或者分类被加载到内存时调用,编译完成后运行程序就触发,只调用一次。2.调用顺序:父类先于子类,主类先于分类,多个分类按编译顺序执行。3.特点:主动重写,无需调用super,线程不安全,耗时操作会影响启动速度。4.场景:常用于runtime方法交换、全局钩子、初始化配置。initialize方法:1.调用时机:类第一次被实例化、调用类方法时触发,懒加载机制。2.调用顺序:父类先执行,子类未重写时会继承父类的initialize,可能重复调用。3.特点:线程安全,系统加锁控制,多次触发可通过静态变量规避重复逻辑。4.场景:用于类的全局静态配置、单例初始化、全局参数赋值。二、内存管理核心(BAT必问)1.MRC与ARC原理,ARC是编译时还是运行时机制?MRC是手动内存管理,需要开发者手动写retain、release、autorelease,靠人工控制引用计数,容易出现内存泄漏和野指针。ARC是自动引用计数,属于编译时机制,不是运行时。编译器会在编译阶段,自动在合适的位置插入retain、release、autorelease代码,和手动MRC代码逻辑完全一致,只是不用开发者手写。ARC核心规则:谁创建、谁持有、谁释放,局部变量出作用域自动释放,强引用持有对象,弱引用不持有、对象销毁后自动置空。2.强引用、弱引用、无引用的区别,weak原理?strong强引用:默认属性修饰符,持有对象,引用计数+1,只要有强引用指向,对象就不会销毁,容易产生循环引用。weak弱引用:不持有对象,引用计数不变化,专门用来解决循环引用。assign无引用:不做内存管理,单纯赋值,修饰基本数据类型、枚举、结构体,修饰对象会产生野指针。weak底层原理:runtime维护了一张全局弱引用表,以对象内存地址为key,所有指向该对象的weak指针地址为value。当对象引用计数为0即将销毁时,runtime会遍历弱引用表,把所有指向该对象的weak指针统一置为nil,从根源避免野指针崩溃。3.什么是循环引用?常见场景和解决方案两个或多个对象互相强引用对方,导致引用计数都无法降为0,对象无法释放,造成内存泄漏。常见场景:1.代理模式:控制器代理、自定义view代理,用strong修饰会循环引用;2.Block回调:Block内部引用外部self,self又持有Block;3.父子对象互相强引用、数组嵌套强引用等。解决方案:1.代理统一用weak修饰;2.Block内部使用__weak弱化self,必要时搭配__strong保证回调过程中self不销毁;3.打破双向强引用,改为单向强引用、单向弱引用。4.AutoreleasePool原理、什么时候释放?自动释放池是栈结构,存储所有加入池中的autorelease对象,延迟释放对象,避免频繁创建销毁对象带来的性能损耗。主线程默认有自动释放池,每次RunLoop迭代结束时,会自动清空当前池,池中所有对象统一release。手动创建的@autoreleasepool{},在大括号结束时立即释放池中对象。使用场景:遍历创建大量临时对象、图片渲染、数据解析等,手动加autorelease池可以降低内存峰值,避免内存暴涨。三、RunLoop底层(面试高频难点)1.RunLoop是什么?作用是什么?RunLoop是运行循环,本质是一个死循环,保证线程不退出、持续监听事件。iOS程序能持续运行、响应点击、滑动、定时器、网络回调,全部依赖RunLoop。主线程默认开启RunLoop,子线程默认没有,创建子线程任务执行完就立即销毁。核心作用:保活线程、处理事件、管理线程生命周期、节省CPU资源,无事件时休眠,有事件时唤醒执行。2.RunLoop运行模式、核心逻辑RunLoop有多种运行模式,常用的是kCFRunLoopDefaultMode(默认模式,处理日常事件)、UITrackingRunLoopMode(滑动模式,scrollView滑动时切换)、kCFRunLoopCommonModes(占位模式,包含前两种模式)。运行逻辑:线程休眠-监听Source0(触摸、UI事件)、Source1(端口、系统事件)、Timer、Observer-捕获事件后唤醒线程处理-处理完成再次休眠,循环往复。3.NSTimer滑动失效问题及解决方案NSTimer默认加入默认模式DefaultMode,当页面滑动scrollView时,RunLoop切换到TrackingMode,DefaultMode下的定时器无法执行,造成暂停、失效。解决方案:1.定时器添加到CommonModes,适配所有常用模式,滑动不暂停;2.使用CADisplayLink,基于屏幕刷新帧率,和UI滑动同步,无卡顿失效问题;3.子线程开启RunLoop运行定时器,主线程UI滑动不影响子线程RunLoop。四、多线程GCD核心题1.GCD队列和任务的区别,串行、并行、主队列特点任务:需要执行的代码块,分同步任务sync、异步任务async。同步阻塞当前线程,异步不阻塞。队列:存放任务的容器,负责调度任务,先进先出。1.串行队列:一次只执行一个任务,任务按顺序执行,等待上一个任务完成再执行下一个;2.并行队列:同时开启多个线程,并发执行多个任务,任务执行顺序不确定;3.主队列:特殊串行队列,绑定主线程,专门处理UI刷新、布局、点击事件,主线程同步任务会卡死、死锁。2.GCD死锁产生条件和经典场景死锁核心条件:当前线程等待队列中未完成的任务,队列等待当前线程执行完成,互相等待、卡死不动。经典场景:1.主线程中执行dispatch_sync同步主队列任务,百分百死锁;2.串行队列嵌套同步任务,同一个串行队列里,同步嵌套同步,造成互相等待。异步嵌套、跨队列同步不会死锁。3.GCD栅栏函数、信号量、组任务的使用场景栅栏barrier:用于并行队列,拦截前后任务,保证栅栏前任务全部执行完,再执行栅栏任务,最后执行后续任务。常用于异步读写、数据同步,解决多线程数据竞争。信号量semaphore:控制最大并发线程数、线程同步、限流。比如网络请求并发限制、异步任务顺序执行。任务组group:监听多个异步任务全部完成,统一回调。比如多接口并行请求,全部成功后再刷新UI、合并数据。五、UI与布局、渲染原理1.UIView和CALayer的区别、关系UIView是界面视图,负责响应触摸事件、处理用户交互、管理视图层级;CALayer是图层,负责绘制内容、渲染界面、展示视觉效果,不处理交互。每一个UIView内部都默认绑定一个CALayer,UIView是Layer的管理者,我们看到的页面内容,都是Layer渲染出来的。View负责事件,Layer负责渲染。Layer可以设置阴影、圆角、边框、3D变换,性能比View更高,但是无交互能力。2.iOS页面渲染流程、卡顿原因渲染流程分三步:布局、绘制、渲染。1.布局阶段:系统调用layoutSubviews,计算控件frame、层级、约束;2.绘制阶段:调用drawRect,绘制文本、图片、背景、渐变等内容;3.渲染阶段:CPU把绘制内容打包,交给GPU纹理渲染、合成图层,最终展示到屏幕。卡顿核心原因:屏幕每秒刷新60帧,每帧耗时需控制在16ms以内。CPU布局绘制耗时过长、GPU图层过多、离屏渲染、阴影模糊、约束冗余,都会导致掉帧卡顿。3.离屏渲染是什么?哪些操作会触发?如何优化?正常渲染是GPU在当前屏幕缓冲区直接渲染,离屏渲染是GPU开辟新的临时缓冲区,先渲染完成再切换到屏幕缓冲区展示,开销极大,容易造成卡顿。触发场景:设置圆角+裁剪、阴影、遮罩、模糊效果、图层混合、光栅化。优化方案:1.图片提前裁剪圆角,用静态图片代替代码圆角裁剪;2.阴影设置shadowPath,固定阴影路径,减少实时计算;3.减少多余图层、避免多层叠加混合;4.合理开启shouldRasterize光栅化,静态页面复用渲染结果,动态页面不建议开启。六、性能优化专项(BAT重点考察)1.启动优化怎么做?分阶段优化方案App启动分为pre-main和main之后两个阶段,优化核心是缩短两个阶段耗时。pre-main阶段优化:1.减少无用动态库、合并重复库;2.删减无用分类、减少load方法逻辑;3.优化符号解析、减少编译冗余代码。main之后阶段优化:1.didFinishLaunching中只放核心初始化,第三方SDK、统计、推送、非核心配置异步延迟初始化;2.首页UI懒加载、数据懒加载,先渲染骨架页,再加载真实数据;3.避免主线程耗时操作,数据库读写、文件操作、数据解析全部放子线程。2.列表卡顿优化(UITableView/UICollectionView)1.cell提前注册、复用,避免频繁创建销毁cell;2.cell内部控件提前布局,减少动态计算frame、动态约束;3.异步绘制文本、图片,子线程预处理数据,主线程只赋值展示;4.滑动时停止加载图片,停止滑动后再继续加载;5.高度缓存,预计算cell高度,避免实时计算;6.减少cell离屏渲染、图层混合,简化UI层级。3.内存泄漏检测和优化方案检测工具:XcodeLeaks、Instruments、MLeaksFinder、线上内存监控日志。常见泄漏场景:循环引用、静态变量未释放、缓存无上限、定时器未销毁、代理强引用、Block捕获self。优化方案:统一weak代理、定时器页面销毁时invalidate、缓存设置最大容量、页面生命周期结束清空临时数据、杜绝无用静态常驻对象。七、Swift基础与混编1.Swift中struct和class的区别1.结构体是值类型,存储在栈区,赋值、传参都是值拷贝,独立互不影响;类是引用类型,存储在堆区,赋值指向同一个对象,修改会互相影响。2.结构体不支持继承,类支持继承、多态;3.结构体默认无构造器,自动生成成员构造器,类需要手动实现构造器;4.结构体生命周期简单,无需手动管理内存,类需要考虑引用计数、内存泄漏。2.optional可选型原理、解包方式可选型本质是枚举,包含none和some两个case,用来处理空值,避免空值崩溃。解包方式:强制解包(风险高,慎用)、可选绑定iflet、guardlet安全解包、
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年精神科护士岗位练习题及答案
- 2026年起重吊装作业安全管控考核全真试卷及答案
- 2026年安全生产考试题库(行业安全规范)安全生产法规专项试题(附答案)
- 2026年企业法律顾问婚姻法冲刺卷
- 2026年审计师考试统计学原理能力测试卷
- 2026年安全生产管理人员模拟试题(含答案)
- 2026年安全培训年度工作计划
- 2026年安庆市迎江区网格员考试题库及答案
- 高二德育教学设计:基于共情觉醒的《学会理解、学会感恩》主题班会实施方案
- 小学五年级综合实践活动“不用土的栽培术”单元整体教学设计
- 2026年职业病诊断医师资格考试(基础理论及法律法规)历年参考题库含答案
- (2026秋新版)统编版道德与法治六年级上册全册教案
- 《蜡烛的燃烧》课时练习及答案-2026-2027学年人教鄂教版(新教材)小学科学五年级上册
- 金属选矿厂检修安全注意事项培训课件
- 2026安全生产法完整版
- 流动吸附法测定比表面积BET课件
- 国际私法(华东政法大学)智慧树知到期末考试答案章节答案2024年华东政法大学
- 闭合导线观测记录及平差计算表(四边形)
- GB/T 678-2023化学试剂乙醇(无水乙醇)
- LY/T 2574-2016国家沙漠公园总体规划编制导则
- GB/T 475-2008商品煤样人工采取方法
评论
0/150
提交评论