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

下载本文档

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

文档简介

iOS初级开发面试题及详细答案(真实职场版)本套面试题适配iOS初级开发者,涵盖OC/Swift基础、UI开发、内存管理、多线程、项目实战、常见问题排查等企业高频面试考点,答案贴合实际开发场景,通俗易懂,无书面化生硬套话。一、OC基础核心面试题1.简述OC中栈区、堆区、全局区的区别,以及日常开发中对应的使用场景答案:栈区:系统自动分配、自动释放,内存空间小、速度快。所有基本数据类型、局部变量都存放在栈区。函数调用、代码块执行结束后,栈区变量会立刻销毁,不会产生内存泄漏。堆区:需要开发者手动管理内存(MRC)或依赖自动管理(ARC),空间大、速度慢。所有OC对象、动态开辟的内存都在堆区。堆区对象不会随函数结束销毁,需要依靠引用计数管理,也是项目中内存泄漏的主要来源。全局区:存放全局变量、静态static变量,程序启动开辟、程序结束才释放。整个项目生命周期内常驻内存,多处调用不会重复创建,适合存放全局配置、通用常量。2.ARC下strong、weak、assign、copy的区别及使用场景答案:strong:强引用,持有对象,引用计数+1。只要有强引用指向对象,对象就不会销毁。是OC对象属性的默认修饰符,日常开发中自定义对象、视图、模型基本都用strong。weak:弱引用,不持有对象,引用计数不变化。对象销毁后,weak指针会自动置空,不会产生野指针。核心用途是解决循环引用,比如代理、block回调、控件关联引用。assign:直接赋值,不做内存管理,多用于基本数据类型(int、float、BOOL)。不能修饰OC对象,对象用assign会出现野指针崩溃。copy:拷贝特性,分为浅拷贝、深拷贝。主要用于NSString、NSArray、NSDictionary这类不可变容器,防止外部修改原值导致当前属性数据异常。比如外界传入可变字符串,用copy可以固化数据,避免被篡改。3.什么是循环引用?日常开发中如何解决?答案:两个或多个对象互相强引用对方,导致引用计数无法归零,对象无法释放,造成内存泄漏。常见场景:父子对象互相持有、控制器与block互相强引用、代理属性被strong修饰。解决方式:1.代理统一使用weak修饰,避免控制器和视图循环引用;2.block内部使用弱指针(__weaktypeof(self)weakSelf=self;),打破自循环引用;3.父子层级对象,子对象用weak引用父对象。4.简述Block的原理、类型及常见使用注意事项答案:Block本质是封装了代码块、变量捕获的OC对象,底层有结构体、isa指针。主要用来保存代码逻辑、实现回调传值。Block分为三种:1.全局Block:不捕获外部变量,存放在全局区,常驻内存;2.栈Block:捕获外部变量,存放在栈区,函数结束后销毁;3.堆Block:被strong/copy修饰后拷贝到堆区,需要手动管理引用计数,是开发中最常用的类型。注意事项:核心就是防循环引用,block内部引用self必须用弱指针;同时避免在block内部长时间持有大对象,造成内存占用过高。二、Swift基础面试题1.Swift中let和var的区别,以及适用场景答案:let是常量,初始化后不允许修改值,线程安全、性能更优;var是变量,支持随时修改。开发规范:能使用let绝不使用var。所有固定数据、标签文本、控件对象、模型属性优先用let;只有需要动态修改的数据(状态值、计数器、动态参数)才用var。2.Swift中weak、unowned的区别答案:两者都是弱引用,用于解决循环引用,不增加引用计数。weak:修饰可选类型,对象销毁后指针自动置为nil,安全无崩溃,日常开发优先使用,适配绝大多数场景。unowned:修饰非可选类型,默认假定指针永远不为空,如果对象提前销毁,访问会直接崩溃。仅用于生命周期完全一致、绝对不会提前释放的对象场景,使用极少。3.简单说明Swift可选型的作用,以及!和?的区别答案:可选型是Swift的核心特性,用来解决值为空的情况,明确区分“有值”和“无值”,避免空值崩溃。?:可选解包,安全解包。如果值为nil,不报错,返回nil;常用于可选绑定、可选链式调用,开发首选。!:强制解包,不安全。强行解析可选值,如果值为nil,直接崩溃。仅在百分百确定有值的场景使用,日常开发尽量避免。三、UI与布局核心面试题1.Frame和AutoLayout的区别,各自优缺点答案:Frame:通过坐标、宽高固定控件位置,基于父视图坐标系。优点是简单、性能高、逻辑直观;缺点是适配多机型、屏幕旋转、动态尺寸非常麻烦,代码冗余多。AutoLayout:通过约束描述控件相对关系,不固定具体坐标。优点是适配性极强,适配多机型、动态布局、屏幕旋转非常方便;缺点是多层约束嵌套时会有性能损耗,约束冲突容易出现报错、布局错乱。实际开发:简单固定页面用Frame,复杂适配、动态布局页面全部用AutoLayout。2.TableView卡顿的常见原因及优化方案答案:常见卡顿原因:1.cell内部子视图过多、层级复杂,重复创建视图;2.cellForRow方法中做耗时操作(网络请求、大量计算、图片渲染);3.图片未裁剪、尺寸过大,离屏渲染严重;4.频繁刷新表格、局部刷新不当。优化方案:1.利用cell复用机制,提前注册cell,避免滚动时动态创建;2.耗时操作、网络请求放到子线程,UI刷新放回主线程;3.图片预裁剪、缓存,避免实时渲染;减少圆角、阴影等离屏渲染属性,或开启光栅化;4.按需刷新,禁止全局reloadData,使用reloadRows局部刷新;5.简化cell层级,减少多余视图嵌套。3.简述UI主线程机制,为什么UI刷新必须在主线程?答案:iOS的UIKit框架是非线程安全的,所有视图的创建、修改、刷新、布局操作,都必须在主线程执行。如果在子线程操作UI,会造成UI资源抢占、视图状态错乱、布局异常,严重时直接闪退、黑屏。开发规范:子线程处理数据、网络、计算,所有UI更新操作回调到主线程执行。四、多线程与网络面试题1.GCD中串行队列、并行队列的区别,主队列、全局队列特性答案:串行队列:任务按顺序执行,上一个任务结束才会执行下一个,同一时间只有一个任务在运行,线程安全。并行队列:多个任务同时并发执行,开启多条线程,任务执行顺序不固定,适合批量耗时操作。主队列:系统唯一串行队列,绑定主线程,专门处理UI事件、UI刷新,任务优先度最高。全局队列:系统自带并行队列,无需手动创建,日常子线程耗时操作首选,性能优于自定义并行队列。2.什么是死锁?GCD常见死锁场景答案:多个任务互相等待对方执行完成,互相阻塞,导致所有任务永久无法执行,线程卡死。初级开发最常见死锁:主线程同步嵌套主线程任务。比如在主线程中调用dispatch_sync往主队列添加任务,主线程等待新任务执行,新任务等待主线程空闲,互相等待直接死锁。解决:主线程禁止使用sync同步执行任务,耗时操作全部异步执行。3.iOS网络请求常见问题及处理方案答案:1.网络超时:设置合理超时时间,超时后给出用户提示,支持重试;2.无网络/弱网:实时监听网络状态,无网时弹窗提示,禁止无效请求;3.重复请求:页面加载、按钮点击时加锁,防止短时间多次点击发起重复接口请求;4.数据缓存:首页、静态接口数据做本地缓存,优化弱网体验;5.异常处理:统一封装请求失败、服务器异常、参数错误的回调,避免闪退。五、内存与性能优化面试题1.iOS常见内存泄漏场景有哪些?答案:1.代理未用weak修饰,造成控制器无法释放;2.block内部强引用self,形成循环引用;3.全局变量、静态变量常驻内存,持续持有临时对象;4.NSTimer、CADisplayLink未及时销毁,持有控制器;5.循环创建对象、未清空数组字典数据,页面退出未释放资源。2.简单说说你日常做过的iOS性能优化点答案:1.UI优化:简化视图层级、优化TableView滚动、减少离屏渲染、图片裁剪缓存;2.内存优化:解决循环引用、页面退出清空资源、避免大对象常驻内存;3.线程优化:耗时操作全部放子线程,UI只在主线程刷新,避免主线程卡顿;4.网络优化:拦截重复请求、缓存静态数据、适配弱网超时;5.代码优化:复用视图、复用网络工具类,减少冗余代码和重复创建对象。六、项目实战与基础原理面试题1.简述iOS页面跳转传值的几种方式及适用场景答案:1.属性传值:正向传值首选,简单高效,适合页面直接跳转传参;2.代理传值:反向传值、跨页面回调,适合一对一传值;3.Block传值:轻便灵活,适合简单的反向回调,代码简洁;4.通知传值:一对多传值,适合多个页面监听同一事件,注意页面销毁移除通知,避免内存泄漏;5.单例传值:全局共享数据,适合全局通用配置、用户信息。2.通知、KVO的使用注意事项答案:通知:页面添加监听后,必须在dealloc中移除监听,否则会造成内存泄漏、野指针崩溃;避免滥用通知,过多通知会导致代码逻辑混乱。KVO:监听属性变化实现回调,必须手动移除监听,不移除会直接闪退;不支持一次性自动移除,适合监听数据、状态实时变化场景。3.简单介绍MVC架构,以及你项目中的使用方式答案:MVC分为模型、视图、控制器三层,是iOS最基础的架构。Model:负责数据处理、数据解析、数据缓存,只处理数据,不接触UI;View:负责页面展示、用户交互,只负责UI渲染,不处理业务逻辑、不请求网络;Controller:负责协调View和Model,处理业务逻辑、网络请求、页面跳转、数据赋值。日常开发中严格分层,把Cell、自定义View单独抽离,把数据解析、网络工具类抽离分类,避免控制器代码臃肿,方便维护和迭代。七、常见报错与问题排查面试题1.常见的闪退原因有哪些?答案:1.野指针访问:对象已销毁,指针仍访问对象;2.数组字典越界:访问不存在的下标、key;3.主线程卡顿超时

温馨提示

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

最新文档

评论

0/150

提交评论