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

下载本文档

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

文档简介

iOS高频面试题及详细答案(真实职场版)一、OC基础核心面试题1.说一说OC的@property关键字及区别@property是对成员变量的封装,自动生成getter、setter方法,日常开发核心关键字分为修饰权限、内存管理、线程、特殊属性四类,实际使用区别如下:内存管理关键字strong:强引用,默认关键字,适用于OC对象。持有对象,计数器+1,只要有强引用指向,对象就不会销毁。日常自定义对象、UI控件基本都用strong。weak:弱引用,不持有对象,计数器不变化。对象销毁后,指针会自动置空,不会产生野指针。专门用于解决循环引用,比如代理、block内部引用self、控件约束引用。assign:直接赋值,不做内存管理。只用于基本数据类型(int、float、BOOL)和枚举,不能修饰对象,会产生野指针。copy:拷贝,生成新对象。NSString、NSArray、NSDictionary不可变集合必须用copy,防止外部可变对象修改导致数据错乱;mutable对象一般不用copy。权限与特性关键字retain:MRC时代关键字,作用同strong,ARC下基本废弃。readonly:只有getter方法,没有setter方法,只能赋值初始化,后续无法修改。readwrite:默认属性,同时有getter、setter。nonatomic:非原子性,不加锁,访问速度快,日常开发通用。atomic:原子性,加线程锁,保证读写安全,但速度极慢,业务代码几乎不用,仅系统底层部分属性使用。2.strong、weak、assign核心区别,以及使用场景这三个是面试高频重点,核心差异在内存引用、对象销毁逻辑、野指针问题:strong逻辑:强引用,持有对象,引用计数+1特点:对象不会主动释放,多个强引用会造成内存泄漏、循环引用场景:所有自定义UI控件、模型对象、自定义类对象weak逻辑:弱引用,不持有对象,引用计数不变特点:对象销毁后指针自动nil,无野指针场景:delegate代理、block引用self、storyboard/xib拖拽控件assign逻辑:直接内存赋值,无引用计数管理特点:对象销毁后指针不会置空,直接变成野指针,访问会崩溃场景:基本数据类型、NSInteger、CGFloat、BOOL3.copy和mutableCopy的区别,深浅拷贝原理拷贝核心区分浅拷贝、深拷贝,且严格区分可变、不可变对象:浅拷贝(copy):只拷贝对象指针,不拷贝内存数据,新旧对象共用同一块内存,引用计数+1。深拷贝(mutableCopy):重新开辟内存,拷贝所有数据,新旧对象完全独立,互不影响。具体场景不可变对象(NSString、NSArray)调用copy:浅拷贝,指针复制不可变对象调用mutableCopy:深拷贝,生成可变对象可变对象(NSMutableString、NSMutableArray)调用copy、mutableCopy:都是深拷贝,copy生成不可变对象,mutableCopy生成可变对象开发实战意义:定义NSString用copy,防止外部传入NSMutableString,后续修改数据污染原有属性值。4.什么是循环引用?如何解决?循环引用本质:两个或多个对象互相持有对方(双向strong引用),导致引用计数无法归零,对象无法释放,造成内存泄漏。常见场景A对象strong持有B,B对象strong持有ABlock内部直接引用self,block又被selfstrong持有代理属性用strong修饰解决方案代理、回调属性统一用weak修饰block内部使用__weak弱化self,必要时搭配__strong防止提前释放手动断开引用:页面销毁时置空双向引用的属性5.__block和__weak的区别__weak:用于解决block循环引用,弱化对象引用,不改变变量内存,只能修饰对象,不能修饰基本数据类型。修饰后对象无持有,自动防野指针。__block:核心作用是让block可以修改外部变量。会将外部变量包装成对象,存在堆内存中。可修饰基本数据类型和对象类型,无法解决循环引用,过度使用会导致内存常驻。二、UI与视图渲染面试题1.UIView和CALayer的区别与联系iOS视图渲染核心是Layer,View只是封装层,二者分工明确:核心区别UIView:负责交互与事件响应,继承自UIResponder,能接收点击、滑动手势,是用户可见可交互的载体。CALayer:负责渲染与展示,继承自NSObject,无事件响应能力,只处理颜色、阴影、圆角、动画、图层绘制。联系每一个UIView内部都默认自带一个CALayer,我们给View设置的圆角、边框、阴影,本质都是修改Layer属性;View是Layer的事件代理,所有渲染结果通过Layer展示,所有用户操作由View响应。2.iOS视图渲染流程(drawRect时机)整体流程:布局(Layout)→绘制(Draw)→渲染(Render)布局阶段:系统调用layoutSubviews,遍历所有子视图,计算、更新视图frame、约束,确定视图位置大小。绘制阶段:布局完成后触发drawRect,开发者可重写该方法,用CoreGraphics绘制自定义图形、文字。渲染阶段:将绘制后的图层数据提交给GPU,GPU进行光栅化、渲染,最终展示到屏幕。drawRect调用时机视图第一次加载、视图大小发生变化、调用setNeedsDisplay/setNeedsLayout时会触发,日常开发禁止手动直接调用drawRect。3.setNeedsDisplay和setNeedsLayout区别setNeedsLayout:标记视图需要重新布局,异步触发layoutSubviews,只更新frame、约束,不刷新绘制内容。适合修改控件位置、大小后调用。setNeedsDisplay:标记视图需要重新绘制,异步触发drawRect,刷新图层绘制内容,不修改布局。适合自定义绘图、修改视图样式后调用。4.圆角、阴影优化方案(解决离屏渲染)常规写法view.layer.masksToBounds+cornerRadius会触发离屏渲染,GPU额外开辟缓冲区渲染,页面卡顿、掉帧。优化方案简单圆角:使用贝塞尔曲线绘制圆角,替代系统原生裁剪阴影优化:设置shadowPath,明确阴影路径,让GPU无需实时计算阴影范围静态视图圆角:提前绘制图片缓存,避免实时渲染列表大量圆角:统一用绘图工具类预渲染,禁止cell内部实时裁剪三、多线程与GCD面试题1.GCD队列和任务的区别,串行、并行队列区别核心概念任务:需要执行的代码块(block),分为同步任务、异步任务队列:存放任务的容器,遵循FIFO先进先出原则队列类型串行队列:同一时间只执行一个任务,任务按顺序逐个执行,等待上一个任务完成再执行下一个。并行队列:同一时间可同时执行多个任务,任务并发执行,无需等待上一个任务结束。任务类型同步任务(sync):阻塞当前线程,等待任务执行完毕才返回,不开启新线程。异步任务(async):不阻塞当前线程,直接返回,系统自动开启新线程执行任务。2.GCD死锁产生原因及场景死锁本质:线程互相等待,任务互相阻塞,导致代码永久卡住,无法执行。最常见场景:主线程同步执行主线程任务主线程是串行队列,当前主线程正在执行代码,此时用dispatch_sync往主线程队列添加任务,新任务需要等待当前代码执行完,当前代码又等待新任务完成,互相等待触发死锁。次要场景:同一串行队列中,同步嵌套执行当前队列任务,也会触发死锁。解决方式:主线程任务全部用异步执行,禁止串行队列同步嵌套。3.GCD栅栏函数、延时函数使用场景栅栏函数dispatch_barrier_async作用:拦截并行队列任务,先执行队列中已有任务,再执行栅栏任务,最后执行后续任务。场景:多读单写场景,保证数据读写安全,避免读写冲突。延时函数dispatch_after本质:不是延时执行代码,是延时将任务添加到队列,时间到后才入队执行,存在微小时间误差。场景:页面延迟加载、倒计时、延迟弹窗、避免点击过快重复触发。4.GCD信号量作用核心作用:控制并发数量、线程同步、解决多线程数据抢夺问题。原理:设置最大并发数,信号量大于0时允许执行任务,执行一次信号量-1,任务结束信号量+1,超出并发数的任务会阻塞等待。实战场景:网络请求批量并发、限制图片下载最大线程数、多线程数据同步读写。四、内存管理与性能优化1.ARC原理,ARC是编译时还是运行时机制?ARC是编译时机制,不是运行时。编译器在编译代码阶段,自动帮我们插入retain、release、autorelease代码,替代手动MRC内存管理,运行时不会额外处理。核心规则:谁创建、谁持有、谁释放,自动管理引用计数,杜绝常规内存泄漏。2.常见内存泄漏场景及排查方式高频泄漏场景循环引用:self->block->self、代理strong修饰定时器NSTimer强引用self,页面销毁不关闭定时器全局变量、静态变量常驻内存,页面对象被全局持有无法释放通知、KVO注册后未移除,残留监听排查工具XcodeInstruments工具:Leaks检测内存泄漏、Zombies检测野指针崩溃、Allocation查看内存增长。3.列表卡顿优化(UITableView/UICollectionView优化)列表卡顿是面试核心实操题,优化从渲染、复用、计算、内存四个维度处理:单元格复用:严格使用dequeueReusableCell,禁止每次创建新cell预计算高度:提前缓存cell高度,禁止cell内部实时计算、动态频繁布局减少离屏渲染:cell内部控件禁止大量圆角、阴影、遮罩,提前预处理样式异步绘制:复杂图文混排、大图绘制放到子线程,绘制完成再回主线程刷新滑动优化:滑动时停止刷新、停止网络请求,停止滑动后再加载数据内存管控:大图压缩、缓存复用、滚动回收无用资源五、Swift基础与OC混编1.let和var的区别let:常量,赋值后不可修改,线程安全,优先使用,性能更优var:变量,支持多次修改,可变数据使用核心细节:let修饰的引用类型,地址不可变,但内部属性可以修改;var修饰的类型地址、属性均可修改。2.Swift可选型?和!区别可选?(弱解包):表示变量可能为nil,使用时自动判断空值,为空则不执行代码,安全无崩溃。隐式解包!:默认变量一定有值,强制解包,为空时直接崩溃,仅确定非空场景使用。3.OC与Swift混编原理Swift调用OC:项目自动生成项目名-Bridging-Header.h桥接文件,导入OC头文件即可直接使用。OC调用Swift:系统自动生成项目名-Swift.h文件,OC导入该文件,即可调用Swift类和方法。六、网络与项目实战1.HTTP和HTTPS区别HTTP:明文传输,无加密、无校验、端口80,速度快,不安全,容易被抓包、篡改数据。HTTPS:HTTP+SSL/TLS加密,端口443,传输数据加密、身份校验、防篡改,安全可靠,是目前项目通用方案。2.网络请求异常处理、重试机制、缓存策略异常处理:区分无网络、超时、服务器500/404、参数错误、token失效等状态,统一封装错误回调。重试机制:针对弱网、瞬时网络波动,设置次数限制、间隔重试,禁止无限重试。缓存策略:核心数据本地沙盒缓存、列表数据增量更新、静态资源缓存,优先读取本地缓存,再异步刷新网络数据。七、底层原理面试题1.OC对象本质是什么?OC对象本质是结构体,底层基于C语言结构体实现。所有OC对象内部都有一个isa指针,指向对象所属的类,用来存储类的方法、属性、成员变量等元数据,是OC面向对象、消息机制的核心。2.isa指针作用实例对象isa指向类对象类对象isa指向元类对象元类isa指向根元类,形成闭环核心作

温馨提示

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

评论

0/150

提交评论