版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS高频面试题及详细答案(实战干货版)一、Objective-C基础核心1.讲讲OC中的@property关键字修饰符及区别日常开发中@property主要分为内存管理、读写权限、线程安全三类修饰符,核心区别如下:内存管理类strong:默认修饰对象类型,持有引用,计数器+1。属性销毁前对象不会释放,适用于所有OC对象,是最常用的修饰符。weak:弱引用,不增加引用计数。对象销毁后属性自动置nil,专门用来解决循环引用,常用于代理、控件、block内部引用对象。assign:直接赋值,不做内存管理,不参与引用计数。专门修饰基本数据类型(int、float、BOOL)、枚举、结构体,修饰对象会产生野指针。copy:拷贝对象,生成新内存地址。NSString、NSArray、NSDictionary常用,目的是防止外部可变对象修改导致属性值被篡改。可变对象用copy会变成不可变类型。读写权限类readwrite:默认,同时生成getter、setter方法。readonly:只生成getter方法,外部无法赋值,常用于对外暴露的只读属性。线程安全类atomic:默认,保证读写操作的原子性,单条读写线程安全,但不保证多线程连续操作安全,性能差。nonatomic:非原子操作,不保证线程安全,读写速度快,日常开发几乎全部使用这个。2.copy和mutableCopy的区别核心差异是拷贝类型(深/浅拷贝)和返回对象类型,分可变、不可变对象两种场景:不可变对象(NSString、NSArray)
copy:浅拷贝,只拷贝指针,内存地址不变,返回不可变对象;
mutableCopy:深拷贝,开辟新内存,地址改变,返回可变对象。
可变对象(NSMutableString、NSMutableArray)
copy:深拷贝,开辟新内存,返回不可变对象,修改会崩溃;
mutableCopy:深拷贝,开辟新内存,返回可变对象。
总结:只有不可变对象的copy是浅拷贝,其余所有拷贝都是深拷贝;copy统一返回不可变对象,mutableCopy统一返回可变对象。3.什么是循环引用?如何解决?多个对象互相strong持有对方,导致彼此引用计数无法归零,dealloc不会执行,造成内存泄漏。常见场景及解决方案代理循环引用:协议属性用weak修饰,绝对不用strongBlock循环引用:block内部引用self时,用__weak弱化self,内部如需防止提前释放,可搭配__strong使用父子对象互相持有:子对象对父对象的引用用weak4.__block、__weak、__strong、__unsafe_unretained区别__block:用于修饰局部变量,让block内部可以修改外部变量;同时会将变量封装成对象存储在堆上。可解决block无法修改外部变量的问题,不自动破环引用。__weak:弱引用,不计数,对象销毁自动置nil,安全,专门解决循环引用。__strong:默认修饰符,强引用,持有对象,计数+1。__unsafe_unretained:无引用计数,不自动置nil,对象销毁后会产生野指针,极易崩溃,基本废弃不用。二、内存管理机制1.OC内存管理机制原理OC采用引用计数机制管理堆内存,栈内存由系统自动管理。核心规则:谁创建、谁持有、谁释放。alloc/new/copy/mutableCopy创建的对象,引用计数为1,持有者需要负责释放;非自己创建的对象,无需手动管理。MRC时代需要手动retain、release、autorelease;ARC是编译器自动在合适位置插入内存管理代码,本质还是引用计数,只是不用手动写。2.栈、堆、全局区、常量区区别栈区:系统自动分配释放,存储局部变量、函数参数。内存空间小、速度快,先进后出,函数执行完毕立即释放。堆区:手动管理(ARC自动管理),存储通过alloc创建的对象。空间大、速度慢,需要手动释放,容易产生内存泄漏、野指针问题。全局区/静态区:存储全局变量、static静态变量,程序启动分配、程序结束释放,全程常驻内存。常量区:存储字符串常量、宏定义常量,只读不可修改,程序结束释放。3.内存泄漏的常见场景及排查方式常见泄漏场景Block、代理的循环引用NSTimer、CADisplayLink强持有self,未及时销毁常驻线程未退出、线程保活未销毁全局集合数组、字典持续添加对象,不清理View层级移除后,仍有外部强引用排查工具Xcode自带Instruments,核心用Leaks检测内存泄漏、Allocation查看内存增长趋势;也可通过DebugMemoryGraph实时查看对象引用关系,快速定位循环引用。三、RunLoop底层原理1.什么是RunLoop?作用是什么?RunLoop是运行循环,本质是线程的消息循环机制,让线程有事干活、没事休眠、不退出。默认主线程开启RunLoop,保证App持续运行、接收点击、滑动、刷新等事件;子线程默认没有RunLoop,执行完任务立即销毁。核心作用:保活线程、处理事件、节省CPU资源、实现定时器、常驻线程、页面渲染等功能。2.RunLoop的运行模式及常用场景RunLoop有多种运行模式,模式是事件的筛选条件,同一时间只运行一种模式。kCFRunLoopDefaultMode:默认模式,日常处理普通点击、滚动、定时器事件,闲置时处于该模式。UITrackingRunLoopMode:界面滚动模式,列表滑动时RunLoop切换至此模式,优先级最高,会暂停defaultMode的定时器,保证滑动流畅不卡顿。kCFRunLoopCommonModes:占位模式,等价于default+tracking两种模式,定时器、监听事件添加到该模式下,滚动页面也能正常执行。3.NSTimer为什么滑动列表会停?怎么解决?默认NSTimer添加在DefaultMode,列表滑动时RunLoop切换到TrackingMode,DefaultMode的事件暂停,所以定时器停止。解决方案:将定时器添加到CommonModes,适配滚动场景;或者使用GCD定时器,GCD定时器不依赖RunLoop模式,全程正常执行。四、多线程与GCD1.GCD队列与任务区别、串行/并行队列区别任务:就是需要执行的代码块,分为同步任务(sync)、异步任务(async)。同步阻塞当前线程,等待任务执行完才继续往下走;异步不阻塞,直接开启新线程执行任务。队列:存放任务的容器,遵循FIFO先进先出。串行队列:同一时间只执行一个任务,任务按顺序逐个执行,只会开启1条线程。并行队列:同一时间可执行多个任务,自动开启多条线程,任务并发执行,但队列取任务依然有序。2.各种GCD组合执行效果(面试高频)主队列+同步任务:死锁!主队列等待任务执行,任务等待主队列空闲,互相阻塞。主队列+异步任务:主线程串行依次执行。串行队列+同步任务:当前线程串行执行,不开启新线程。串行队列+异步任务:新开线程,任务顺序执行。并行队列+同步任务:当前线程顺序执行,不并发。并行队列+异步任务:多线程并发执行,无序。3.GCD死锁的根本原因同一个队列中,同步任务等待队列空闲,队列等待同步任务执行完成,形成互相等待的闭环,就会触发死锁。最常见的就是主线程调用dispatch_sync执行主队列任务。4.GCD栅栏函数、延时函数、信号量作用栅栏dispatch_barrier:在并行队列中,等待前面所有任务执行完毕,再执行栅栏任务,栅栏任务完成后,后续任务才可以并发执行。多用于读写锁,解决多线程读写数据冲突。延时dispatch_after:不是准时执行,是延时后将任务添加到队列,等待队列空闲才执行,存在微小误差。信号量dispatch_semaphore:控制最大并发线程数、解决多线程数据安全、实现线程同步。信号量为0时阻塞线程,大于0时放行任务。5.GCD与NSOperation对比GCD:纯C语言,底层高效,轻量级,只支持任务、队列、依赖简单操作,适合大量简单并发任务。NSOperation:基于GCD封装,OC面向对象,功能更丰富。支持任务暂停、取消、继续、任务依赖、最大并发数设置,适合复杂线程任务管理。五、UI渲染与卡顿优化1.UI渲染原理、屏幕刷新机制iPhone屏幕默认每秒刷新60次,刷新间隔16ms。系统会在每次刷新时,通过CPU计算布局、绘制文本图片→GPU渲染图层、纹理合成→屏幕显示完成一帧画面。如果16ms内没有完成一帧渲染,就会掉帧、界面卡顿。2.卡顿的核心原因及优化方案卡顿根本原因:主线程耗时操作过多,超过16ms无法完成一帧渲染。常见耗时操作主线程大量计算、数据解析、循环遍历频繁创建销毁视图、重复布局、重复绘制图片解码、大图渲染、模糊效果耗时主线程网络请求、文件读写优化方案所有耗时操作挪到子线程:网络、解析、解码、计算缓存视图、避免重复创建,复用cell、view减少图层渲染,避免shadow、cornerRadius离屏渲染,可预渲染、裁切优化按需加载、滑动减速时加载数据,减少滚动时刷新操作图片预处理、压缩尺寸、缓存解码后的图片3.离屏渲染是什么?如何避免?正常渲染是屏幕直接渲染图层,离屏渲染是GPU提前开辟临时缓冲区,先渲染图层再合成到屏幕,耗时极高,是卡顿主要元凶。触发场景:设置阴影、圆角+裁剪、蒙版、模糊、光栅化。优化方式:用贝塞尔曲线裁切替代系统圆角、手动绘制阴影、避免同时开启圆角和裁剪、合理使用shouldRasterize缓存渲染结果。六、Block底层原理1.Block的本质、三种类型Block本质是封装了代码块和变量捕获的OC对象,底层是结构体,有isa指针,具备对象特性。根据存储位置分为三种:全局Block(__NSGlobalBlock):没有捕获任何外部变量,存储在常量区,程序全程存在。栈Block(__NSStackBlock):捕获外部变量,存储在栈区,函数结束后立即销毁,极易野指针崩溃。堆Block(__NSMallocBlock):栈Block被copy后转移到堆区,需要内存管理,日常开发使用的基本都是堆Block。2.Block变量捕获机制全局变量:直接访问,不捕获。局部基本变量:值捕获,拷贝变量当前值,block内部无法修改外部值。局部对象变量:指针捕获,拷贝指针地址,内部可以修改对象属性,无法修改指针本身。__block修饰变量:结构体包装变量,block内部可以直接修改变量值。七、Swift基础高频题(混开发必问)1.let/var区别、值类型与引用类型let:常量,不可修改,修饰引用类型时,地址不变,属性可改;var:变量,可修改。值类型:struct、enum、基本数据类型,赋值是值拷贝,各自独立互不影响。引用类型:class,赋值是地址拷贝,多个变量指向同一个对象,修改互相影响。2.weak/unowned区别weak:弱引用,对象销毁后自动置nil,可选类型,安全,适用于大部分循环引用场景。unowned:无主引用,不置nil,对象销毁后访问直接崩溃,非可选类型,性能略高,适用于对象生命周期完全一致的场景。3.闭包循环引用原因及解决Swift闭包默认强捕获外部对象,self强持有闭包,闭包强持有self,形成循环引用。解决:使用weakself、unownedself弱化引用,打破循环。八、项目实战与进阶面试题1.组件化的思路及优势将项目按业务、功能拆分多个独立组件,组件之间通过路由、协议通信,不直接依赖。优势:解耦、降低代码耦合度、多人并行开发、编译速度快、维护迭代简单、支持模块单独复用。2.图片加载优化方案使用WebP压缩图片,减小包体积和加载流量;根据屏幕尺寸裁剪图片,避免加载超大图;使用YYImage、SDWebImage异步解码,子线程处理图片;内存缓存+磁盘缓存结合,避免重复下载解码;列表预加载图片,滑动时
温馨提示
- 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中国美妆个护成分创新与社交媒体营销效果评估报告
- 监理工程师之监理概论练习题库附带答案
- (正式版)DB15∕T 1932-2020 《公路抗凝冰沥青混合料设计与施工技术规范》
- 桡骨茎突狭窄性腱鞘炎22课件
- 《建筑施工技术》课件-第三章 砌筑工程
- 世界毒品报告
- 2025年MySQL数据类型试题及答案
- GB/T 34110-2025信息与文献文件(档案)管理核心概念与术语
- 2025年湖北行测试题及答案
- 《商法(第七版)》课件全套 赵万一
- 化学废液处理协议书范本
- 波动率微笑(宽客大师教你建模)
- AIGC提示词美学定义
评论
0/150
提交评论