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

下载本文档

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

文档简介

iOS基础面试题及详细答案(真实职场版)一、Objective-C基础核心题1.简述OC中的堆和栈的区别堆和栈是程序内存分配的两种核心方式,在iOS开发中区别非常明确:栈内存由系统自动分配、自动释放,存储局部变量、基本数据类型、指针变量地址。栈空间固定、容量小、存取速度快,线程独享,不会出现内存泄漏。函数执行结束后,栈内变量立即销毁。堆内存需要开发者手动管理(MRC)或通过ARC自动管理,所有OC对象都分配在堆上。堆空间灵活、容量大、存取速度慢,全局共享。堆内存如果持有关系处理不当,会出现内存泄漏、野指针问题。简单总结:变量地址在栈,对象本体在堆。2.ARC的原理是什么?ARC是完全不用管内存吗?ARC是自动引用计数机制,本质是编译器在编译阶段自动帮我们插入retain、release、autorelease内存管理代码,不需要开发者手动书写内存管理方法。ARC并不是完全不用管理内存,只是简化了手动操作。依然需要处理循环引用、野指针、过度持有等问题。ARC只管理堆上OC对象的内存,不管理基本数据类型、CoreFoundation、C语言结构体等内存。常见ARC需要手动处理的场景:block循环引用、代理属性循环引用、NSTimer常驻引用、CF对象桥接后的内存释放。3.讲一下strong、weak、assign、copy的区别及使用场景strong:强引用,持有对象,引用计数+1,对象不会被释放。是OC对象默认修饰符。适用于所有需要持有、生命周期跟随当前对象的属性,比如自定义视图、模型、业务对象。weak:弱引用,不持有对象,引用计数不变化。对象销毁后,指针自动置空,不会产生野指针。主要用于解决循环引用,最常见的是代理、block内部引用外部控制器、定时器回调对象。assign:直接赋值,不做内存管理,指针地址直接拷贝。修饰基本数据类型(int、float、BOOL)、枚举、结构体。不能修饰OC对象,容易产生野指针。copy:深拷贝,生成新对象,断开原有对象的内存关联。主要用于NSString、NSArray、NSDictionary这类可变/不可变容器。防止外部可变对象修改导致当前属性值被动变化,保证数据安全。4.什么是循环引用?如何解决常见循环引用?两个或多个对象互相强引用对方,导致引用计数永远无法归0,对象无法释放,造成内存泄漏,这就是循环引用。常见场景及解决方案:1)父子对象互相引用:子对象的父对象属性用weak修饰;2)Block内部引用外部控制器/变量:使用__weak弱化外部对象,必要时内部用__strong保证执行期间不销毁;3)NSTimer持有控制器:用Target中间层、或者定时器invalidate及时销毁;4)代理协议属性:统一用weak修饰,禁止strong。5.深拷贝和浅拷贝的区别?mutableCopy和copy的差异浅拷贝只拷贝对象指针地址,新旧对象指向同一块堆内存,修改一个会影响另一个,引用计数+1。深拷贝会开辟新内存空间,拷贝对象内容,新旧对象完全独立,互不影响。copy对不可变对象是浅拷贝,对可变对象是深拷贝;mutableCopy无论可变还是不可变对象,都是深拷贝,且返回可变对象。开发中字符串、数组、字典用copy修饰,核心目的就是防止外部可变数据篡改内部属性。二、Block核心面试题1.Block的本质是什么?三种Block类型Block本质是一个封装了函数代码块、变量捕获的OC结构体,是自带代码逻辑的对象。Block分为三种类型:1)全局Block(__NSGlobalBlock__):没有捕获外部变量,存储在全局区,生命周期跟随APP,不会销毁;2)栈Block(__NSStackBlock__):捕获外部变量,存储在栈区,函数结束后立即销毁,极易崩溃;3)堆Block(__NSMallocBlock__):栈Block被copy后迁移到堆区,开发者日常使用的Block基本都是堆Block,需要注意内存引用问题。2.Block为什么会捕获变量?__block的作用Block会在定义时捕获当前作用域的外部变量,保存变量瞬时值,保证后续执行时代码逻辑不受外部变量变化影响。默认情况下,Block只能读取外部局部变量,不能修改。因为捕获的是变量的值,不是变量地址。__block修饰局部变量后,变量会被封装成结构体存储在堆上,Block捕获变量地址,既可以读取也可以修改外部变量,同时解决变量提前销毁的问题。三、iOS运行机制&消息机制1.简述OC的消息发送机制OC是动态语言,所有方法调用本质都是消息发送,编译时不会确定函数地址,运行时才动态绑定方法实现。调用[objmethod]本质是objc_msgSend(obj,@selector(method))。执行流程:首先通过对象的isa指针找到类对象->在类的方法列表中查找方法实现->找到直接执行->未找到则进入消息转发流程。2.消息转发的完整流程当方法在当前类、父类都找不到实现时,会触发三级消息转发:1)动态方法解析:调用resolveInstanceMethod,可动态添加方法实现;2)备用接收者:调用forwardingTargetForSelector,将消息转发给其他对象处理;3)完整消息转发:调用methodSignatureForSelector和forwardInvocation,自定义消息转发逻辑。三级转发全部失败,程序崩溃,报unrecognizedselector异常。3.isa指针的作用每个OC对象都有isa指针,是对象的核心指针。实例对象的isa指向类对象,类对象的isa指向元类对象,元类isa指向根元类,形成完整的继承链和方法查找链。对象通过isa指针找到所属类,进而查找实例方法;类通过isa找到元类,查找类方法。四、UI与主线程、渲染机制1.为什么UI操作必须在主线程?iOS的UIKit框架是非线程安全的,所有视图的创建、修改、刷新、布局操作,都必须在主线程执行。子线程操作UI会导致UI渲染错乱、视图异常、隐性崩溃、界面卡顿等问题。系统主线程专门负责UI渲染、事件响应、界面刷新,保证UI操作的串行有序。2.RunLoop是什么?作用是什么?RunLoop是运行循环,本质是一个死循环,用来保活线程、监听事件、处理任务。主线程默认开启RunLoop,保证程序启动后不立即退出,持续监听点击、滑动、刷新、定时器等事件。子线程默认没有RunLoop,执行完任务立即销毁。核心作用:保活线程、处理异步事件、定时任务、界面刷新、手势事件响应。日常开发中NSTimer、PerformSelector、GCD延时任务都依赖RunLoop。3.页面卡顿的常见原因及优化思路卡顿本质是主线程阻塞、CPU/GPU负载过高,页面刷新帧率低于60帧。常见原因:主线程做耗时操作(网络请求、文件读写、大量计算)、视图层级过多、重复布局、图片解压耗时、Cell复用不当、大量定时器、主线程频繁刷新UI。优化方案:耗时任务丢子线程、优化视图层级、合理复用Cell、预解压图片、减少不必要的布局刷新、销毁闲置定时器、懒加载视图。五、多线程GCD基础1.GCD串行、并行队列区别;同步、异步区别队列决定任务执行顺序:串行队列:任务按顺序执行,一个执行完再执行下一个,同一时间只有一个任务执行;并行队列:任务同时并发执行,多个任务同时运行,依赖线程池资源。任务执行方式:同步(sync):阻塞当前线程,等待任务执行完成后,代码才继续往下走,不会开辟新线程;异步(async):不阻塞当前线程,开辟新线程执行任务,代码立即向下执行。2.GCD死锁产生的原因及常见场景死锁核心:同一串行队列中,同步任务互相等待,线程互相阻塞,导致任务永远无法执行。最常见场景:主线程中执行dispatch_sync主线程队列任务,会直接死锁。自定义串行队列,嵌套同步任务也会死锁。解决方式:同步改异步、使用并行队列、避免同队列嵌套同步任务。3.dispatch_once的作用及原理dispatch_once用于保证代码在程序生命周期内只执行一次,线程安全,常用于单例创建、全局配置初始化。底层通过令牌标记实现,内部有锁机制,多线程环境下不会重复执行,执行效率高,是iOS最安全的单例实现方式。六、内存优化与常见问题1.内存泄漏的常见场景1)循环引用:控制器、View、Block、代理互相强引用;2)NSTimer未销毁、常驻线程未退出;3)全局变量、静态变量长期持有对象;4)缓存数据不清理、图片资源未释放;5)CF对象桥接后未手动释放。2.野指针是什么?僵尸模式的作用野指针是指向已经销毁、不存在内存空间的指针。访问野指针会导致程序闪退、未知崩溃。通常由指针未置空、提前释放、内存踩踏导致。僵尸模式(Zombie)开启后,系统不会立即销毁释放的对象,会标记为僵尸对象,访问时会精准打印崩溃对象和原因,方便排查野指针崩溃问题,仅用于开发调试,不能上线开启。七、Swift基础高频题(iOS通用基础)1.let和var的区别let定义常量,不可修改,线程安全,推荐优先使用;var定义变量,可随时修改。注意:let修饰引用类型对象,对象本身不可替换,但对象的属性可以修改。

温馨提示

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

评论

0/150

提交评论