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

下载本文档

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

文档简介

iOSBAT高频面试题及详细答案(实战版)一、Objective-C基础核心1.详细讲解OC的属性关键字assign、weak、strong、copy的区别及使用场景答案:strong(强引用)是默认的对象引用方式,会持有对象,让对象计数器+1,只要有强引用指向对象,对象就不会被释放。使用场景:所有OC对象类型,比如NSString、UIView、自定义Model等。weak(弱引用)不会持有对象,计数器不变化,对象销毁后,指针会自动置nil,不会产生野指针。核心作用是解决循环引用。使用场景:代理、block外部引用、控件弱引用、避免父子对象循环引用。assign(赋值引用)直接赋值指针地址,不做计数管理,对象销毁后指针会变成野指针,不会自动置空。专门用于基本数据类型。使用场景:int、float、double、BOOL等基本数据类型,以及枚举、结构体。copy(拷贝)会拷贝对象内容,生成新内存地址的对象,原对象修改不影响新对象。分为浅拷贝和深拷贝,OC中不可变对象copy是浅拷贝,可变对象copy是深拷贝。使用场景:NSString、NSArray、NSDictionary这类不可变集合,防止外部可变对象修改导致数据异常。避坑总结:NSString必须用copy,不用strong;代理必须用weak,不用assign;基本数据类型只用assign。2.什么是循环引用?如何解决?常见场景有哪些?答案:循环引用是指两个或多个对象互相强引用对方,导致引用计数无法归零,对象无法释放,造成内存泄漏。常见场景1.父子对象互相strong引用;2.代理属性用strong修饰;3.Block内部引用外部self,同时self持有block;4.两个Model互相持有对方。解决方案1.代理统一使用weak修饰;2.Block内部使用__weak修饰self,必要时配合__strong防止提前释放;3.双向引用中,一方strong、一方weak,打破闭环;4.手动置空互相引用的属性。3.深拷贝、浅拷贝的区别?NSObject、NSString的拷贝机制答案:浅拷贝:只拷贝指针地址,不开辟新内存,新旧对象指向同一块内存,修改一个另一个同步变化。深拷贝:开辟全新内存,拷贝对象所有内容,新旧对象内存独立,互不影响。OC拷贝规则1.不可变对象(NSString、NSArray):copy浅拷贝,mutableCopy深拷贝;2.可变对象(NSMutableString、NSMutableArray):copy、mutableCopy均为深拷贝;3.自定义对象默认不支持copy,需要遵守NSCopying协议并实现copyWithZone方法。二、Block核心面试题(BAT必问)1.Block的类型、底层原理、内存分布答案:Block本质是一个封装了函数体和上下文变量的OC对象,底层是结构体,包含isa指针、函数指针、捕获的变量。三种类型及内存位置1.全局Block(__NSGlobalBlock):存放在代码段,无外部变量捕获,生命周期跟随App,不会释放;2.栈Block(__NSStackBlock):存放在栈内存,捕获外部变量,函数结束后立即销毁,极易野指针;3.堆Block(__NSMallocBlock):栈Block被copy后迁移到堆内存,有引用计数,可长期持有,日常开发中使用的block基本都是堆Block。2.Block为什么会捕获变量?__block的作用是什么?答案:Block定义时会捕获当前作用域的外部变量,值类型变量直接拷贝值,指针类型变量拷贝指针地址,保证后续执行时能访问定义时的变量数据。默认情况下,Block内部无法修改外部局部变量,因为捕获的是常量副本。__block核心作用1.让局部变量可以被Block内部修改;2.将变量从栈内存包装到堆内存的结构体中,让Block可以持有变量;3.解决变量值修改、跨作用域同步的问题。3.Block循环引用的完整解决方案(面试标准答案)答案:场景:self强持有block,block内部强引用self,形成闭环循环引用。标准解决方式1.常规写法:使用__weaktypeof(self)weakSelf=self;内部使用weakSelf,打破强引用闭环;2.防崩溃优化:耗时任务中搭配__strongtypeof(weakSelf)strongSelf=weakSelf;防止任务执行过程中self提前释放,导致逻辑中断;3.终极方案:页面销毁时,手动置空block,彻底切断引用。三、多线程与RunLoop(面试重灾区)1.GCD队列类型、同步异步区别、死锁场景总结答案:队列类型1.串行队列(Serial):任务逐个执行,同一时间只有一个任务执行;2.并发队列(Concurrent):任务同时执行,开启多条线程并发处理。任务类型1.同步任务(sync):阻塞当前线程,等待任务执行完毕再继续后续代码,不开启新线程;2.异步任务(async):不阻塞当前线程,直接往下执行,会开启新线程(并发队列下)。必问死锁场景1.主线程中执行dispatch_sync主队列任务,直接死锁;2.同一串行队列中,同步任务嵌套同步任务,死锁;核心原理:当前线程等待任务完成,任务又依赖当前线程执行,互相等待导致卡死。2.RunLoop原理、作用、运行机制答案:RunLoop本质是线程的循环运行机制,是一个事件循环,让线程不执行任务时休眠、有任务时唤醒执行,避免线程空转消耗CPU。核心作用1.保持主线程常驻运行,监听点击、滑动、刷新等UI事件;2.管理NSTimer、GCD延时任务、端口事件;3.保证线程生命周期可控,空闲休眠、有事干活。运行机制RunLoop会循环处理sources0(UI事件、自定义事件)、sources1(系统内核事件)、timer、port事件,处理完所有事件后进入休眠,等待下一次事件唤醒。主线程默认开启RunLoop,子线程默认关闭,需要手动开启。3.线程保活的实现方式及原理答案:子线程默认执行完任务就销毁,如需常驻线程,需要开启RunLoop保活。实现步骤1.初始化子线程;2.在线程任务中添加RunLoop循环;3.必须添加常驻模式的Source/Timer,否则RunLoop启动后立即退出;4.任务结束后手动停止RunLoop,销毁线程,避免内存泄漏。四、UI与布局、渲染原理1.UIView与CALayer的区别、关系答案:1.UIView是界面可视控件,负责响应交互、处理手势、点击事件,继承自UIResponder;2.CALayer是图层,负责页面渲染、绘制、动画、展示内容,不处理任何交互;3.每个UIView内部都默认持有一个CALayer,UIView是Layer的事件封装层,Layer是UIView的展示底层;4.UIView依赖CALayer完成画面渲染,所有的圆角、阴影、边框、动画本质都是Layer的属性。2.iOS渲染流程、卡顿原因及优化方案答案:渲染流程:布局(Layout)->绘制(Display)->渲染(Render)->合成(Compose)->屏幕显示。卡顿核心原因:主线程任务过重、渲染耗时超过16ms,无法保证60帧刷新率。优化方案1.主线程只处理UI刷新,所有耗时操作(网络、解析、计算、文件读写)丢子线程;2.减少图层重叠、避免离屏渲染(圆角+阴影+透明度叠加极易触发);3.缓存静态视图、复用Cell、减少动态计算布局;4.避免频繁刷新UI、批量更新视图。3.自动布局AutoLayout优缺点及适配技巧答案:优点:适配多机型、横竖屏简单,无需手动计算frame,代码简洁,适配动态文字、暗黑模式更方便。缺点:约束冲突容易崩溃、大量约束会有性能损耗、复杂布局优先级难把控。实战适配技巧1.控件约束不写死固定宽高,多使用相对约束、比例约束;2.利用优先级、抗拉伸、抗压缩属性解决布局适配问题;3.列表Cell提前预估高度、缓存高度,避免实时计算卡顿。五、内存管理与性能优化(高阶)1.iOS内存泄漏常见场景及排查方法答案:常见泄漏场景1.Block、代理循环引用;2.NSTimer未销毁、常驻线程未关闭;3.全局变量、静态变量无限累加不释放;4.页面跳转残留引用、通知未移除、KVO未移除;5.图片、大文件数据未及时释放。排查工具1.XcodeDebugMemoryGraph实时查看内存引用关系;2.Instruments检测Leaks泄漏点;3.手动分析页面dealloc是否执行,判断页面是否正常释放。2.KVO原理、使用注意事项、崩溃原因答案:KVO是键值监听,基于runtime动态生成子类,重写setter方法,在属性值改变时触发监听回调。核心注意点1.必须成对添加和移除监听,页面销毁前必须removeObserver;2.不允许重复添加监听,会导致多次回调、野指针崩溃;3.监听对象提前释放,未移除监听,必崩;4.优先使用block版KVO,无需手动移除,更安全。六、Runtime底层面试题1.Runtime核心作用、常用场景答案:Runtime是OC的动态运行机制,让OC具备动态性,所有的方法调用、消息转发都是runtime完成的。常用实战场景1.方法交换(Hook),实现无侵入埋点、替换系统方法;2.动态添加属性、动态添加方法;3.字典转模型、自动归档解档;4.拦截方法调用、处理消息转发;5.获取类的所有属性、方法、成员变量。2.OC消息转发机制流程答案:当调用对象未实现的方法时,不会直接崩溃,会走三级消息转发流程:1.动态方法解析:调用resolveInstanceMethod,动态添加未实现的方法;2.备用接收者:调用forwardingTargetForSelector,将消息转发给其他对象处理;3.完整消息转发:调用methodSignatureForSelector和forwardInvocation,自定义消息处理逻辑;三级流程全部走完仍未处理,才会报方法未实现崩溃。七、项目实战与架构面试题1.MVC、MVVM的区别?为什么项目要用MVVM?答案:MVCModel数据、View视图、Controller控制器。弊端是Controller过于臃肿,所有业务逻辑、数据处理、视图代理都堆在控制器中,代码耦合严重,复用性差,难以维护。MVVM新增ViewModel层,剥离控制器的业务逻辑、数据处理、网络请求,View只负责展示,ViewModel负责数据加工、业务逻辑、状态管理,控制器只做调度。优势:代码解耦、逻辑复用、方便单元测试、页面逻辑清晰、适合大型项目迭代维护。2.列表滑动卡顿优化,你项目中做过哪些实战优化?答案:1.Cell高度缓存,提前计算,避免滑动时实时计算;2.所有图片裁剪、圆角绘制、数据解析放到子线程处理;3.减少Cell内部图层数量,避免重叠离屏渲染;4.滑动时停止加载异步任务,停止刷新UI,滑动结束后再更新;5.复用Cell、复用视图,避免频繁创建销毁对象;6.大列表分页加载、预加载,避免一次性加载过多数据。八、网络与安全面试题1.HTTP与HTTPS区别,HTTPS加密流程答案:区别HTTP明文传输、无加密、端口80、不安全、易被抓包篡改;HTTPS基于SSL/TLS加密、端口443、传输安全、防篡改、防窃听。HTTPS握手加密流程1.客户端请求服务端,携带支持的加密套件;2.服务端返回

温馨提示

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

最新文档

评论

0/150

提交评论