版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS开发笔试面试试题及详细答案(实战版)适用人群:初级/中级iOS开发工程师考察范围:Swift语法、OC基础、内存管理、RunLoop、多线程、UI布局、网络、项目实战、性能优化题型:选择题、填空题、简答题、代码题、实战问答题一、单项选择题(共10题,每题3分,共30分)1.以下关于Swift中let和var说法正确的是?()A.let修饰的变量完全不能修改任何内容B.var修饰的常量可以随意修改内存地址C.let修饰引用类型时,对象内部属性可以修改,对象地址不可变D.let和var本质没有区别2.OC中关键字weak的核心作用是?()A.提升对象访问速度B.打破循环引用,不持有对象、不改变引用计数C.强制对象常驻内存D.防止对象被过早释放3.iOS中负责监听事件、管理线程生命周期、处理消息分发的核心机制是?()A.GCDB.RunLoopC.NSOperationD.AutoreleasePool4.以下哪种线程队列属于串行队列?()A.dispatch_get_global_queueB.手动创建的dispatch_queue_t(默认参数)C.主队列main_queueD.以上都是5.Swift中unowned和weak的主要区别是?()A.unowned可以用于值类型,weak只能用于引用类型B.unowned是非可选类型,崩溃风险更高;weak是可选类型,对象释放后置nilC.unowned会保留引用计数,weak不会D.无本质区别6.UIKit渲染、布局、刷新的执行顺序正确的是?()A.layout->display->updateConstraintsB.updateConstraints->layout->displayC.display->layout->updateConstraintsD.updateConstraints->display->layout7.以下关于autorelease说法错误的是?()A.自动释放池会在当前RunLoop迭代结束后统一释放对象B.频繁创建大量临时对象时,手动添加@autoreleasepool可优化内存C.autorelease会立即降低对象引用计数D.主线程默认开启自动释放池8.Swift中static和class修饰方法的区别是?()A.static可以重写,class不能重写B.static为静态方法,不允许子类重写;class允许子类重写C.只有结构体可以用class修饰D.只有类可以用static修饰9.解决Block循环引用,以下方案不推荐的是?()A.[weakself]B.[unownedself]C.强引用self不做任何处理D.提前打破持有关系,置空闭包10.以下不属于iOS卡顿主要原因的是?()A.主线程大量耗时计算B.主线程频繁IO操作C.子线程异步网络请求D.视图层级过多、离屏渲染频繁二、填空题(共5题,每题4分,共20分)1.OC内存管理的核心原则是:__________、__________、release、autorelease。2.GCD中,__________函数可以保证代码在整个程序生命周期内只执行一次,常用于单例创建。3.Swift中捕获列表[weakself]主要用于解决__________问题。4.UI刷新必须在__________线程执行,子线程刷新UI会导致未知异常、界面错乱。5.RunLoop的两种运行模式是__________和__________。三、简答题(共4题,每题8分,共32分)1.详细说明OC与Swift的主要区别,从内存、语法、性能、开发场景四个维度作答。2.什么是循环引用?iOS中常见的循环引用场景及对应的解决方式有哪些?3.简述RunLoop的工作机制,以及日常开发中哪些场景依赖RunLoop?4.说明GCD死锁产生的核心原因,并写出两种常见死锁场景。四、代码实操题(共1题,8分)使用Swift实现一个线程安全的单例,要求:支持全局访问、线程安全、不允许外部初始化、兼容继承。五、实战优化题(共1题,10分)日常开发中UITableView滚动卡顿是常见问题,请结合实际开发经验,写出UITableView性能优化的完整方案(至少6点)。参考答案及详细解析一、单项选择题答案及解析1.答案:C解析:let代表常量,存储的内存地址不可变;如果修饰数组、自定义对象等引用类型,内部的属性、元素可以正常修改。A错误,引用类型可改内部数据;B错误,var是变量,地址可改;D错误,二者内存约束规则不同。2.答案:B解析:weak是弱引用,不会增加对象引用计数,对象释放后指针自动置空,核心用于解决代理、Block、对象嵌套带来的循环引用问题。3.答案:B解析:RunLoop是线程的消息循环机制,让线程常驻、监听触摸、定时器、网络回调等事件;GCD、NSOperation是多线程调度工具,AutoreleasePool是内存释放机制。4.答案:C解析:主队列是系统默认的串行队列,所有UI操作都在主队列串行执行;全局队列是并发队列,手动创建的队列默认串行,可通过参数设置并发,因此最准确的答案是主队列。5.答案:B解析:二者都是无持有引用。unowned为非可选类型,假设对象永远不释放,对象销毁后访问会直接崩溃;weak为可选类型,对象释放后自动置nil,安全性更高,日常开发优先用weak。6.答案:B解析:UI刷新完整链路:先更新约束(updateConstraints)、再调整布局(layoutSubviews)、最后绘制渲染(drawRect/display)。7.答案:C解析:autorelease不会立即释放对象,只是将对象加入自动释放池,等待RunLoop迭代结束后统一释放、降低引用计数。8.答案:B解析:static修饰的静态方法/属性,属于当前类/结构体,子类无法重写;class仅可用于类的方法,允许子类重写,适配多态场景。9.答案:C解析:闭包强持有self,self又持有闭包,会形成永久循环引用,导致内存泄漏,是开发中必须规避的问题。10.答案:C解析:子线程异步网络请求属于后台耗时操作,不会阻塞主线程;主线程耗时计算、IO、过度渲染都会直接导致界面卡顿。二、填空题答案1.alloc、init2.dispatch_once3.闭包循环引用(内存泄漏)4.主(UI)5.kCFRunLoopDefaultMode、UITrackingRunLoopMode三、简答题详细答案1.OC与Swift核心区别(1)内存层面:OC基于MRC/ARC手动+自动管理内存,依赖Runtime运行时机制,动态性强;Swift采用自动ARC管理,增加值类型(结构体、枚举),栈内存分配更多,内存开销更低,安全性更高。(2)语法层面:OC语法繁琐,基于C语言扩展,消息发送机制调用方法;Swift语法简洁,支持泛型、高阶函数、枚举关联值、可选类型,语法更严谨,强制类型校验。(3)性能层面:Swift编译优化更好,静态调度多,运行效率略高于OC;OC依赖运行时消息转发,动态性强但性能略有损耗。(4)开发场景:OC适配老旧项目、兼容老旧系统、依赖大量第三方老框架;Swift是苹果主推语言,适配新API、SwiftUI、跨平台场景,新项目主流选择。2.循环引用及解决方案循环引用:两个或多个对象互相强持有对方,导致引用计数无法归零,对象无法释放,造成内存泄漏。常见场景及解决方案:(1)代理代理:使用weak修饰代理属性,打破双向强持有;(2)Block回调:Swift使用[weakself]/[unownedself],OC使用__weaktypeof(self)weakSelf=self;(3)对象嵌套持有:双向引用中,一方改为弱引用;(4)闭包自持有:回调结束后置空闭包属性,主动打破持有关系。3.RunLoop工作机制及应用场景工作机制:RunLoop是线程的循环监听机制,默认线程执行完代码后立即销毁,RunLoop可以让线程持续存活,循环监听事件源(触摸、定时器、网络回调、端口消息),有事件则处理,无事件则休眠,节省CPU资源。核心运行逻辑:接收事件->处理事件->休眠等待->重复循环。日常应用场景:(1)主线程UI交互、事件响应;(2)NSTimer、CADisplayLink定时任务运行;(3)GCD异步回调、网络请求回调触发;(4)常驻子线程、保活后台任务线程。4.GCD死锁核心原因及常见场景核心原因:在当前串行队列中,同步等待当前队列的任务执行完成,任务互相等待、互相阻塞,导致线程卡死。并发队列不会产生死锁,仅串行队列会出现。常见场景1:主线程同步派发任务到主队列dispatch_sync(dispatch_get_main_queue(),^{});当前主线程正在执行代码,又同步等待主队列任务完成,互相阻塞触发死锁。常见场景2:自定义串行队列,内部同步派发当前队列任务letqueue=DispatchQueue(label:"test")queue.sync{queue.sync{}}四、代码实操题答案(线程安全单例)该方案利用Swift静态属性懒加载特性,天然线程安全,禁止外部初始化,支持继承扩展,适配项目常规需求:swift
classAppManager{
//静态常量懒加载,GCD级线程安全
staticletshared=AppManager()
//私有化初始化,禁止外部创建实例
privateinit(){}
//可选:防止拷贝
privatefunccopy(){}
privatefuncmutableCopy(){}
}
解析:Swiftstaticlet全局静态常量默认懒加载、线程安全,无需手动添加dispatch_once,代码简洁且性能更优;私有化init杜绝外部初始化,保证单例唯一性。五、实战优化题答案(UITableView卡顿优化)1.Cell复用优化:严格使用dequeueReusableCell复用Cell,禁止每次滑动新建Cell,减少对象创建销毁开销,这是最基础的优化手段。2.提前预估行高+缓存行高:开启estimatedRowHeight预估高度,在cellForRow前提前计算Cell高度并缓存,避免滚动时反复计算约束、高度,减少主线程计算压力。3.减少子视图层级:精简Cell内部控件,删除冗余View、冗余约束,避免多层嵌套视图,降低UI渲染、布局计算耗时。4.规避离屏渲染:圆角、阴影、边框尽量提前绘制,开启shouldRasterize光栅化缓存视图,避免滑动时实时离屏渲染导
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026全国海船船员考试轮机部船舶管理8507历年参考题库含答案详解
- 2026全国安全员B证-项目负责人(官方)-第十一章国内外安全生产管理经验参考试题库历年考点答案详解
- 2026全国一级注册建筑师资格考试(建筑材料与构造)历年参考题库含答案详解
- 2026住院医师规范化培训结业理论考核(中医眼科)历年参考题库含答案详解
- 2026住院医师规培-重庆-重庆住院医师规培(内科)历年参考题库含答案详解
- 2026住院医师规培-甘肃-甘肃住院医师规培(急诊科)历年参考题库含答案详解
- 2026住院医师规培-浙江-浙江住院医师规培(急诊科)历年参考题库含答案详解
- 2026住院医师规培-江苏-江苏住院医师规培(神经外科)历年参考题库含答案详解
- 2026住院医师规培-广东-广东住院医师规培(医学影像)历年参考题库含答案详解
- 2026住院医师规培-宁夏-宁夏住院医师规培(眼科)历年参考题库含答案详解
- T8联考2027届高三10月检测训练历史试题(含答案详解)
- 2026中小学诗词大会题库100题题库(含答案)
- 神经内科带教课件
- 2026广东阳江市阳东区面向驻阳东部队随军家属招聘1人笔试备考题库及答案详解
- (新版)水利工程质量检测员资格考试-核心母体1000题-混凝土工程(含答案)(第一部分)
- 26新五年级上册道德与法治【知识点总结】
- 2026年山东省考《申论》真题及答案解析(B卷)
- ICU危重患者呼吸机管理
- 医院高危险性化学品使用管理规定培训
- GB 15082-2026汽车、摩托车用车速表
- 乡统计站工作制度
评论
0/150
提交评论