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

下载本文档

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

文档简介

BATiOS开发面试题及详细答案(实战完整版)说明:本套题库贴合BAT一线互联网公司真实面试场景,剔除书面化套话,答案均为项目实战总结的专业口语化表述,覆盖iOS初级、中级核心考点,无冗余废话,适配日常刷题、面试突击。一、Objective-C基础核心面试题1、OC的@property属性关键字有哪些?各自作用?答:日常开发常用核心关键字分为内存修饰、访问权限、特殊特性三类,实际项目使用规则如下:1.内存管理关键字:-strong:强引用,默认关键字,修饰对象类型。持有对象,只要有强引用指向,对象就不会销毁。多用于UI控件、自定义对象等大部分场景。-weak:弱引用,不持有对象,无内存计数。对象销毁后,指针自动置空,不会产生野指针。核心用于解决循环引用,最常见场景是代理、block内部引用self。-assign:直接赋值,不做内存管理。专门修饰基本数据类型(int、float、BOOL)和枚举,不能修饰对象,会产生野指针。-copy:拷贝特性,分为深拷贝、浅拷贝。修饰NSString、NSArray、NSDictionary等不可变容器,目的是防止外部可变对象修改,导致属性值被动变化。2.访问权限关键字:-readonly:只有getter方法,没有setter方法,外部只能读取不能修改。-readwrite:默认状态,同时拥有getter、setter方法。3.特殊关键字:-nonatomic:非原子性,不加线程锁,访问速度快,日常开发99%场景使用。-atomic:原子性,加线程锁,保证单条读写操作线程安全,但无法保证整体业务逻辑安全,性能差,基本不用。2、strong、weak、assign、copy核心区别?项目中如何选型?答:核心区别和实战选型直接按场景区分,简单好记:1.基本数据类型(数值、布尔、枚举):统一用assign,无需内存管理;2.普通OC对象、UI控件:用strong,需要持有对象;3.代理、block引用self、控件关联对象:用weak,杜绝循环引用、野指针;4.字符串、数组、字典属性:用copy,防止外部可变对象篡改内部数据。补充误区:mutable对象(NSMutableString、NSMutableArray)绝对不能用copy修饰,拷贝后会变成不可变对象,调用可变方法会直接崩溃。3、深拷贝和浅拷贝的区别?什么情况会触发深拷贝?答:浅拷贝:只拷贝对象指针,不开辟新内存,新旧对象共用同一块内存,修改一个另一个会同步变化,本质是指针赋值。深拷贝:开辟全新内存空间,拷贝对象所有内容,新旧对象完全独立,互不影响。触发规则:1.不可变对象(NSString、NSArray)调用copy:浅拷贝,指针复制;2.不可变对象调用mutableCopy:深拷贝,生成可变新对象;3.可变对象(NSMutableString、NSMutableArray)调用copy、mutableCopy:均为深拷贝。4、OC的内存管理机制是什么?MRC和ARC的区别?答:OC核心内存管理是引用计数机制,对象引用计数为0时,系统自动回收内存。MRC(手动内存管理):需要开发者手动写retain、release、autorelease管理计数,代码冗余,容易出现内存泄漏、野指针,目前项目基本淘汰。ARC(自动内存管理):编译器在编译阶段自动插入内存管理代码,无需手动操作计数,核心规则:谁创建,谁释放,编译器自动匹配生命周期。ARC不是实时内存管理,是编译期优化,不会百分百杜绝内存问题,循环引用仍需手动处理。5、什么是循环引用?如何解决?答:两个或多个对象互相持有对方,导致引用计数无法归零,对象无法释放,造成内存泄漏。常见场景及解决方案:1.代理循环引用:协议代理属性用weak修饰;2.Block循环引用:block内部引用self时,使用__weaktypeof(self)weakSelf=self;多层嵌套block搭配__strongtypeof(weakSelf)strongSelf=weakSelf防止提前释放;3.父子对象互相持有:子对象指针用weak修饰。二、Swift核心面试题1、Swift中weak、unowned的区别?答:两者都是弱引用,不增加引用计数,用于解决循环引用,核心区别在释放机制和使用场景:1.weak:修饰可选类型,对象销毁后指针自动置nil,安全无崩溃,适用于对象可能为nil、生命周期不确定的场景(代理、页面跳转传值);2.unowned:修饰非可选类型,对象销毁后指针不会置空,再次访问会直接崩溃,适用于引用对象生命周期绝对一致、不会提前销毁的场景(控制器与自定义view的绑定)。2、Swift闭包的循环引用如何解决?答:主要通过捕获列表处理:1.常规场景:使用[weakself]捕获,闭包内用self?.调用,安全容错;2.确定self一定存在的场景:使用[unownedself],避免可选解包,代码更简洁;3.延时、异步闭包:优先用[weakself],防止对象提前释放导致崩溃。3、Swift结构体和类的区别?答:1.存储方式:结构体是值类型,存储在栈区;类是引用类型,存储在堆区;2.赋值逻辑:结构体赋值是值拷贝,新旧实例独立;类赋值是指针拷贝,指向同一对象;3.继承特性:结构体不支持继承,类支持继承、多态;4.构造方法:结构体有默认成员构造器,类无默认构造器,需要手动实现;5.适用场景:简单数据模型(字典、参数模型)用结构体;需要生命周期、继承、复用的业务对象用类。三、UI框架与页面渲染面试题1、UIView和CALayer的区别与联系?答:联系:每个UIView内部都封装了一个CALayer,UIView负责事件响应、用户交互,CALayer负责页面渲染、图层展示,页面显示的内容本质都是CALayer渲染的。区别:1.交互能力:UIView继承UIResponder,支持点击、滑动等手势交互;CALayer无交互能力,只负责绘制;2.动画性能:CALayer基于底层图形框架,动画渲染性能更高,流畅度更好;3.层级特性:CALayer可以嵌套、设置阴影、圆角、边框,UIView依赖Layer实现样式;4.坐标系统:两者frame、bounds逻辑一致,但Layer不具备自动布局适配能力。2、iOS页面渲染流程是什么?答:整体分为布局、绘制、渲染、合成四个阶段,在RunLoop休眠时触发:1.布局阶段(Layout):系统遍历视图树,计算所有控件的frame、约束,确定控件位置大小,对应layoutSubviews方法;2.绘制阶段(Draw):调用drawRect方法,绘制文本、图片、颜色等内容,生成图层位图;3.渲染阶段(Render):通过GPU对位图进行渲染处理;4.合成阶段(Compose):将所有图层拼接合成,提交到屏幕展示。卡顿核心原因:布局、绘制阶段耗时过长,主线程阻塞。3、layoutSubviews、drawRect调用时机?答:layoutSubviews:视图frame、约束发生变化、视图刷新、父视图布局更新时调用,主要用于子视图布局调整,不要在内部修改frame,会造成递归刷新。drawRect:视图首次渲染、视图重绘(setNeedsDisplay)、视图大小变化时调用,用于自定义绘制图形,仅在需要手动绘制UI时重写,默认不调用。4、AutoLayout适配原理?约束冲突如何排查?答:AutoLayout基于等式、不等式约束计算控件位置大小,通过上下左右、宽高、居中约束,唯一确定控件布局,替代传统frame固定布局,适配多机型。约束冲突排查:Xcode控制台会打印冲突的约束ID,通过ID定位冲突控件,核心原因是约束冗余、约束矛盾、缺少必要约束。实战中优先删除冗余约束,补齐缺失约束,保证控件布局唯一。四、多线程与RunLoop高频面试题1、iOS多线程方案对比?各自适用场景?答:iOS主流三种多线程方案,从底层到上层依次是:1.pthread:C语言底层接口,手动创建、销毁线程,难度高,几乎不用;2.NSThread:OC封装,可手动管理线程生命周期,适合简单单次任务,频繁创建销毁性能差;3.GCD:系统级线程管理,自动复用线程、管理生命周期,性能最优,是项目主流方案。GCD核心场景:异步耗时任务(网络、图片解析、数据解析)、线程同步、任务分组、延时执行。2、GCD串行、并行队列区别?主队列、全局队列特性?答:1.串行队列:任务逐个执行,前一个任务结束才会执行下一个,线程唯一,任务有序;2.并行队列:多个任务同时并发执行,系统自动开辟多线程,任务无序,提升执行效率;3.主队列:专属主线程,串行队列,所有UI操作必须在主队列执行,主线程阻塞会导致页面卡顿;4.全局队列:系统提供的并行队列,无需手动创建,日常异步任务首选。3、GCD死锁产生的原因及场景?答:死锁核心:同一队列中,同步任务等待当前正在执行的任务结束,互相等待卡死。经典场景:主线程中执行dispatch_sync同步任务,主线程等待同步任务执行,同步任务依赖主线程执行,互相阻塞,直接死锁崩溃。规避原则:串行队列内部,禁止嵌套同步任务;主线程绝对不执行同步阻塞任务。4、RunLoop是什么?作用是什么?答:RunLoop是线程的运行循环机制,本质是一个死循环,让线程保活、持续处理事件。核心作用:1.保活线程:默认线程执行完任务立即销毁,RunLoop可以让线程常驻;2.监听事件:监听触摸、手势、网络、定时器、界面刷新等事件;3.节省性能:无事件时线程休眠,有事件时唤醒,避免空跑消耗CPU;4.管理渲染时机:在RunLoop休眠阶段触发UI布局、绘制、刷新。补充:主线程默认开启RunLoop,子线程默认关闭,需要手动开启。5、NSTimer为什么会卡顿、失效?如何解决?答:NSTimer依赖RunLoop运行,默认加入默认模式。当主线程滑动列表、交互时,RunLoop切换到追踪模式,定时器暂停,导致计时不准、卡顿、失效。同时NSTimer会强引用target,容易造成内存泄漏。解决方案:1.将定时器加入RunLoop的通用模式,适配所有交互场景;2.使用GCD定时器替代,不依赖RunLoop,计时精准、无卡顿、无内存泄漏问题,项目首选。五、内存优化与崩溃治理面试题1、iOS常见内存问题有哪些?如何排查优化?答:常见三大内存问题:内存泄漏、野指针、内存暴涨。1.内存泄漏:核心原因是循环引用、静态变量常驻内存、未释放定时器、缓存无上限。排查工具:XcodeInstruments-Leaks、MLeaksFinder。优化方案:weak解决循环引用、及时销毁定时器、设置缓存最大容量、页面退出清空数据。2.野指针崩溃:指针指向已销毁的内存,继续访问导致闪退。多出现于assign修饰对象、对象提前释放。优化:对象属性统一规范修饰,回调、闭包使用弱引用。3.内存暴涨:多为图片过大、缓存过多、列表复用异常、大图未裁剪。优化:图片按需加载、列表Cell复用、大图压缩裁剪、内存缓存定时清理。2、列表卡顿(UITableView/CollectionView)优化方案?答:列表卡顿是面试高频重点,实战全套优化方案:1.复用优化:严格执行Cell复用,禁止频繁创建Cell对象,注册复用ID统一管理;2.布局优化:提前计算Cell高度并缓存,避免实时计算;减少cell内部约束嵌套,降低布局耗时;3.绘制优化:减少离屏渲染(阴影、圆角、光栅化),静态圆角提前裁剪,动态圆角用贝塞尔曲线绘制;4.数据优化:分页加载数据,避免一次性加载大量数据;后台线程解析数据,主线程只刷新UI;5.渲染优化:滑动时停止刷新、停止图片加载,滑动结束后再渲染;6.层级优化:减少Cell内部子控件层级,避免多余嵌套视图,降低渲染压力。3、什么是离屏渲染?如何避免?答:正常UI渲染是屏幕内即时渲染,离屏渲染是GPU提前开辟额外缓冲区渲染图层,再同步到屏幕,会消耗大量GPU资源,直接导致页面卡顿、掉帧。常见触发场景:设置shadow阴影、cornerRadius圆角+mask、光栅化、透明图层叠加。规避方案:1.简单圆角:使用贝塞尔曲线裁剪,替代layer圆角;2.阴影优化:设置shadowPath,提前确定阴影路径,减少渲染计算;3.禁止滥用shouldRasterize光栅化,仅静态视图可少量使用。六、网络与底层原理面试题1、AFNetworking核心原理?答:AFNetworking是基于系统NSURLSession的上层封装,是目前iOS主流网络框架,核心设计:1.基于会话管理:统一创建管理NSURLSession,复用会话资源,减少开销;2.任务封装:对GET、POST、上传、下载任务统一封装,简化调用;3.线程调度:网络请求异步执行,回调自动切回主线程,无需手动切换;4.安全校验:自带HTTPS证书校验、请求参数序列化、响应数据解析;5.网络监听:集成网络状态监听,实时判断WiFi/流量/无网络状态。2、HTTP和HTTPS的区别?HTTPS加密原理?答:核心区别:1.HTTP是明文传输,端口80,无加密、不安全、易被抓包篡改;2.HTTPS是加密传输,端口443,基于HTTP+SSL/TLS加密,安全防篡改、防劫持。HTTPS加密原理:采用非对称加密+对称加密结合的方式:1.握手阶段:客户端和服务端通过非对称加密交换对称密钥;2.传输阶段:后续所有数据通过对称密钥加密传输,兼顾安全性和传输速度。3、iOS网络请求卡顿、超时如何优化?答:实战优化方案:1.超时配置:根据业务场景设置合理超时时间,避免长时间阻塞;2.缓存优化:对静态接口、固定数据做本地缓存,优先读取缓存,无缓存再请求网络;3.并发控制:限制同时最大网络请求数,避免大量请求抢占资源;4.重试机制:弱网、超时场景添加指数退避重试,提升接口稳定性;5.弱网适配:监听网络状态,无网络时直接拦截请求,给出友好提示。七、项目实战与面试拓展题(BAT必问)1、项目中做过哪些性能优化?具体落地效果?答:结合实战总结,简洁落地,无空话:1.UI渲染优化:解决列表离屏渲染问题,通过贝塞尔圆角、阴影路径优化,将页面帧率从50帧提升至60帧满帧;2.内存优化:修复多处循环引用、定时器未释放问题,页面退出内存回落正常,解决长期使用内存暴涨、闪退问题;3.网络优化:对接口做缓存、重试、并发控制,弱网场景接口成功率提升30%,减少用户等待耗时;4.启动优化:拆分启动任务,将耗时任务异步延迟加载,App启动耗时缩短40%;5.图片优化:图片按需加载、大图压缩、WebP格式适配,减少图片内存占用和加载耗时。2

温馨提示

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

评论

0/150

提交评论