2026年iOS开发笔试题及详细答案_第1页
2026年iOS开发笔试题及详细答案_第2页
2026年iOS开发笔试题及详细答案_第3页
2026年iOS开发笔试题及详细答案_第4页
2026年iOS开发笔试题及详细答案_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

2026年iOS开发笔试题及详细答案说明:本试卷贴合2025-2026年iOS最新开发场景,涵盖Swift核心、OC底层、UI开发、多线程、网络编程、性能优化、数据持久化等核心模块,题型全面,答案详细易懂,适合iOS初级至中级开发岗位笔试考核。试卷总分100分,考试时间90分钟。一、单项选择题(每题2分,共20分)下列关于Swift中let和var的说法,错误的是()

A.let声明的常量,其引用不可修改,但引用的对象内部属性可修改

B.var声明的变量,其引用和引用的对象内部属性均可修改

C.let声明的结构体实例,其内部属性不可修改,除非属性被mutating修饰

D.var声明的类实例,若被赋值为nil,需先将其声明为可选类型(?或!)

关于iOS内存管理,下列说法错误的是()

A.ARC(自动引用计数)的核心是自动跟踪对象的引用计数,无需开发者手动调用retain/release

B.weak指针不会持有对象,对象销毁后会自动置为nil,避免野指针

C.assign修饰符适用于基本数据类型,也可用于对象类型以避免循环引用

D.unowned指针不持有对象,对象销毁后不会自动置为nil,适合已知对象生命周期更长的场景下列哪个不是UIKit框架中的视图控件()

A.UILabel

B.CALayer

C.UIButton

D.UITableViewCell

关于GCD(GrandCentralDispatch)的说法,正确的是()

A.dispatch_sync(同步执行)不会阻塞当前线程,会立即返回

B.主队列是串行队列,仅能在主线程执行,用于处理UI相关任务

C.全局并发队列的默认优先级是高优先级(HighPriority)

D.dispatch_after可以精确控制任务的执行时间,不受线程调度影响

下列关于SwiftUI和UIKit的关系,说法正确的是()

A.SwiftUI是UIKit的替代框架,iOS13及以上版本可完全替代UIKit开发

B.SwiftUI底层基于UIKit实现,可与UIKit组件相互嵌套使用

C.SwiftUI仅支持Swift语言,UIKit仅支持Objective-C语言

D.SwiftUI的性能优于UIKit,所有场景下都推荐使用SwiftUI开发

关于iOS网络编程,下列说法错误的是()

A.URLSession是iOS7及以上替代NSURLConnection的网络请求框架

B.Alamofire是基于URLSession封装的第三方网络框架,简化了网络请求代码

C.HTTPS的核心是通过SSL/TLS协议加密传输数据,防止数据被篡改和窃取

D.GET请求可用于提交大量数据,POST请求仅用于获取数据,两者本质无区别

下列关于UITableView的说法,正确的是()

A.UITableView的数据源方法numberOfRowsInSection和cellForRowAt是可选实现的

B.UITableViewCell的重用标识必须在整个项目中唯一

C.刷新表格数据只能使用reloadData()方法

D.UITableView的代理方法可处理单元格点击、滑动删除等事件

关于iOS应用性能优化,下列做法错误的是()

A.图片加载时,根据控件尺寸压缩图片,避免大图占用过多内存

B.避免在viewDidLoad中执行大量耗时操作,可延迟到viewDidAppear中执行

C.尽量使用Autolayout布局,避免手动计算frame,提升代码可读性和适配性

D.频繁创建和销毁的对象,可使用对象池复用,减少内存开销

下列关于Block的说法,错误的是()

A.Block是OC中的闭包,可捕获外部变量,分为全局Block、栈Block、堆Block三种类型

B.Block捕获的外部变量默认是只读的,若要修改需用__block修饰(OC)或inout修饰(Swift)

C.Block与外部对象形成强引用时,会导致循环引用,需用weak修饰外部对象打破循环

D.Swift中的Closure(闭包)与OC中的Block完全不同,无法相互调用

关于iOS17最新特性,下列说法错误的是()

A.支持StandBy模式,可在设备横放时显示时间、通知等信息

B.新增InteractionDesign工具,可快速实现手势交互效果

C.SwiftData框架替代CoreData,简化数据持久化开发

D.不支持第三方应用调用系统相册的编辑功能

二、多项选择题(每题3分,共15分,多选、少选、错选均不得分)下列属于iOS常用框架的有()

A.Foundation

B.UIKit

C.CoreData

D.SpriteKit

关于iOS数据持久化存储,下列选项中可用于存储大量结构化数据的有()

A.UserDefaults

B.CoreData

C.SQLite

D.Keychain

下列关于iOS多线程编程的方式,正确的有()

A.GCD(GrandCentralDispatch)

B.NSOperationQueue

C.NSThread

D.SwiftConcurrency(async/await)

下列属于iOS动画类型的有()

A.UIView基础动画

B.核心动画(CAAnimation)

C.转场动画

D.物理动画(UIDynamic)

关于iOS应用安全,下列做法正确的有()

A.敏感信息(如密码、token)存储在Keychain中,而非UserDefaults

B.网络请求使用HTTPS协议,避免明文传输

C.对用户输入的内容进行校验,防止SQL注入、XSS攻击

D.应用发布前进行代码混淆,防止反编译

三、判断题(每题1分,共10分,对的打√,错的打×)Swift是静态类型语言,编译时会检查类型错误,而Objective-C是动态类型语言,运行时才检查类型错误。()UIViewController的viewDidLoad方法在生命周期中只会调用一次,无论视图是否被移除屏幕。()ARC环境下,开发者无需关注内存管理,所有对象都会被自动释放,不会出现内存泄漏。()Swift中的结构体是值类型,类是引用类型,值类型在赋值时会进行深拷贝,引用类型会进行浅拷贝。()URLSession的dataTask是异步执行的,不会阻塞主线程,适合用于获取小量数据(如接口请求)。()离屏渲染会导致iOS应用卡顿,应尽量避免,比如避免设置cornerRadius+clipsToBounds同时使用。()协议(Protocol)只能定义方法,不能定义属性。()SwiftUI中的@State属性包装器用于存储视图内部的状态,当状态变化时,视图会自动刷新。()CocoaPods是iOS开发中常用的第三方框架管理工具,可自动处理框架的依赖关系和配置。()iOS应用的BundleID是应用的唯一标识,必须与AppStoreConnect中注册的BundleID完全一致,否则无法上架。()四、简答题(每题5分,共25分)简述MVC模式在iOS开发中的应用,并说明各模块的职责。解释什么是KVO(Key-ValueObservation),并说明其使用场景和注意事项。简述iOS应用的五种生命周期状态,以及各状态的核心特点。说明CoreData和SwiftData的区别,以及在2026年开发中如何选择使用。简述iOS应用中内存泄漏的常见场景,并说明如何排查和解决。五、代码题(每题10分,共20分)使用Swift编写代码,实现一个UITableView的基础功能:展示一个包含100条数据(“数据1”到“数据100”)的列表,点击单元格弹出对应的内容提示,并且实现单元格的重用优化。使用GCD实现一个异步任务:在后台线程下载一张网络图片(URL可自定义),下载完成后在主线程更新UIImageView的图片,并处理下载失败(如网络错误)的异常情况。六、实操应用题(10分)假设你正在开发一个iOS社交类应用,需要实现“用户个人资料页面”的核心功能,请回答以下问题:该页面的UI布局应包含哪些核心控件(至少5个),并说明各控件的作用。如何实现页面的数据缓存(比如用户头像、昵称等),避免每次进入页面都重新请求网络。当用户点击“编辑资料”按钮时,如何实现页面的平滑转场(跳转到编辑页面),并保证编辑后的数据能实时同步到个人资料页面。参考答案及详细解析一、单项选择题(每题2分,共20分)答案:B

解析:var声明的变量,其引用可以修改(比如将变量指向另一个对象),引用的对象内部属性也可以修改;但如果var声明的是结构体实例,其内部属性是否可修改,取决于结构体本身的属性是否被mutating修饰,并非所有情况都可修改。A、C、D说法均正确。

答案:C

解析:assign修饰符仅适用于基本数据类型(如int、float),用于对象类型时,不会自动置为nil,会导致野指针,无法避免循环引用;避免循环引用需使用weak或unowned。A、B、D说法均正确。

答案:B

解析:CALayer是图层,用于处理视图的绘制和动画,不属于UIKit的视图控件;UILabel、UIButton、UITableViewCell均是UIKit框架中的常用视图控件。

答案:B

解析:A错误,dispatch_sync(同步执行)会阻塞当前线程,直到任务执行完成才会返回;C错误,全局并发队列的默认优先级是默认优先级(DefaultPriority);D错误,dispatch_after是延迟执行任务,受线程调度影响,无法精确控制执行时间;B说法正确。答案:B

解析:A错误,SwiftUI无法完全替代UIKit,复杂场景(如自定义控件、复杂交互)仍需依赖UIKit;C错误,UIKit支持Swift和Objective-C两种语言;D错误,并非所有场景下SwiftUI性能都优于UIKit,复杂UI场景下UIKit更稳定;B说法正确。

答案:D

解析:GET请求用于获取数据,参数拼接在URL中,有长度限制,不适合提交大量数据;POST请求用于提交数据,参数放在请求体中,无长度限制,两者本质区别在于请求方式和数据传输方式。A、B、C说法均正确。答案:D

解析:A错误,numberOfRowsInSection和cellForRowAt是UITableView数据源的必实现方法,否则表格无法显示数据;B错误,UITableViewCell的重用标识仅需在当前UITableView中唯一,无需在整个项目中唯一;C错误,刷新表格数据还可使用reloadRows(at:with:)、reloadSections(_:with:)等方法,实现局部刷新;D说法正确。

答案:B

解析:B错误,避免在viewDidAppear中执行大量耗时操作,viewDidAppear会在视图显示时多次调用,耗时操作会导致页面卡顿,应将耗时操作放在后台线程执行,或延迟到视图完全显示后异步执行;A、C、D均是正确的性能优化做法。

答案:D

解析:D错误,Swift中的Closure与OC中的Block本质类似,都是闭包,可通过桥接相互调用(如将SwiftClosure传入OC方法,或在Swift中调用OC的Block);A、B、C说法均正确。

答案:D

解析:D错误,iOS17支持第三方应用调用系统相册的编辑功能,开发者可通过Photos框架实现相册编辑相关功能;A、B、C均是iOS17的正确新特性。

二、多项选择题(每题3分,共15分)答案:ABCD

解析:Foundation是基础框架,提供字符串、集合、日期等基础功能;UIKit是界面开发框架,提供视图控件和界面管理;CoreData是数据持久化框架;SpriteKit是游戏开发框架,用于2D游戏开发,四者均是iOS常用框架。

答案:BC

解析:UserDefaults适用于存储少量键值对数据(如用户偏好设置);Keychain适用于存储敏感信息(如密码、token),且不会随应用卸载而丢失;CoreData和SQLite均适用于存储大量结构化数据,CoreData是基于SQLite的封装,使用更便捷。

答案:ABCD

解析:iOS多线程编程的四种核心方式:GCD是苹果推荐的低级多线程框架,简洁高效;NSOperationQueue是基于GCD的高级封装,可灵活管理任务依赖和优先级;NSThread是基础多线程方式,需手动管理线程生命周期;SwiftConcurrency(async/await)是Swift5.5+新增的异步编程方式,语法更简洁。答案:ABCD

解析:iOS动画的四种核心类型:UIView基础动画,适用于简单的视图动画(如平移、缩放);核心动画(CAAnimation),基于图层的动画,更灵活,可实现复杂效果;转场动画,用于页面切换时的过渡效果;物理动画(UIDynamic),模拟现实物理效果(如重力、碰撞)。

答案:ABCD

解析:A正确,Keychain安全性高,适合存储敏感信息,UserDefaults是明文存储,安全性低;B正确,HTTPS可防止数据传输过程中被篡改、窃取;C正确,用户输入校验可避免恶意攻击;D正确,代码混淆可增加反编译难度,保护代码安全。

三、判断题(每题1分,共10分)答案:√

解析:Swift是静态类型语言,编译时会检查变量、常量的类型,避免类型错误;Objective-C是动态类型语言,编译时不检查类型,运行时才会校验类型,可能出现类型错误。

答案:√

解析:UIViewController的viewDidLoad方法仅在视图第一次加载时调用一次,即使视图被移除屏幕(如push到下一个页面),再次返回时也不会重新调用,视图的重新显示会调用viewWillAppear、viewDidAppear方法。

答案:×

解析:ARC虽然会自动管理对象的引用计数,但仍可能出现内存泄漏,比如block与对象形成循环引用、强引用未及时释放等,开发者仍需关注内存管理,避免泄漏。

答案:√

解析:Swift中结构体是值类型,赋值、传参时会创建一个新的副本(深拷贝);类是引用类型,赋值、传参时仅传递引用地址(浅拷贝),多个变量指向同一个对象。

答案:√

解析:URLSession的dataTask是异步执行的,会在后台线程处理网络请求,不会阻塞主线程,适合获取小量数据(如接口返回的JSON数据);获取大量数据(如文件下载)适合使用downloadTask。

答案:√

解析:离屏渲染会导致GPU额外消耗资源,造成页面卡顿,常见的触发场景包括设置cornerRadius+clipsToBounds、阴影、蒙版等,开发中应尽量避免。

答案:×

解析:协议(Protocol)不仅可以定义方法(实例方法、类方法),还可以定义属性(只读属性、读写属性),但协议仅定义属性的声明,不提供实现,需遵循协议的类/结构体实现属性。

答案:√

解析:SwiftUI中的@State属性包装器用于存储视图内部的状态数据,当@State修饰的状态发生变化时,SwiftUI会自动刷新对应的视图,更新UI显示。

答案:√

解析:CocoaPods是iOS开发中最常用的第三方框架管理工具,可自动下载、配置第三方框架,处理框架之间的依赖关系,简化开发流程。

答案:√

解析:BundleID是iOS应用的唯一标识,用于区分不同的应用,必须与AppStoreConnect中注册的BundleID完全一致,否则无法打包上架,也无法通过苹果审核。

四、简答题(每题5分,共25分)答案:

MVC(Model-View-Controller)是iOS开发中最常用的架构模式,将应用程序分为三个相互关联、职责明确的模块,实现数据与界面的分离,便于代码维护和复用。

1.Model(模型):负责数据的逻辑处理和存储,管理数据的生成、验证、更新,不与视图直接交互,当数据发生变化时,通过代理、通知等方式通知控制器。例如:存储用户信息的UserModel,处理网络请求后的数据解析。

2.View(视图):负责展示数据,接收用户交互(如点击、滑动),不包含任何业务逻辑,仅负责UI渲染和事件传递,通过代理将用户操作传递给控制器。例如:UILabel、UIButton、UITableView等控件组成的界面。

3.Controller(控制器):作为Model和View之间的桥梁,接收View传递的用户操作,调用Model的方法处理数据,再将处理后的数据更新到View,协调两者的交互。例如:管理个人资料页面的UIViewController,处理按钮点击事件,请求用户数据并更新界面。

答案:

KVO(Key-ValueObservation)是iOS中的一种键值观察机制,允许一个对象(观察者)监听另一个对象(被观察者)的某个属性变化,当被观察者的属性值发生改变时,观察者会收到通知,从而做出相应的处理。

使用场景:需要实时监听对象属性变化的场景,例如:监听用户信息的变化,实时更新个人资料页面;监听滑动进度,更新进度条显示。

注意事项:

1.监听前需正确注册观察者(addObserver:forKeyPath:options:context:),监听完成后必须移除观察者(removeObserver:forKeyPath:),否则会导致野指针崩溃。

2.被观察的属性必须遵循KVO机制,即属性需通过setter方法赋值(或使用@dynamic修饰),直接修改成员变量无法触发KVO通知。

3.避免循环引用,观察者与被观察者之间尽量使用weak引用。

答案:

iOS应用的五种生命周期状态,从应用启动到终止,依次为:

1.未运行(NotRunning):应用未被启动,或被用户/系统终止,此时应用不占用任何资源,无法执行任何代码。

2.非活跃(Inactive):应用处于前台,但未接收用户事件(如弹出系统通知、来电),此时应用仍在运行,但无法响应用户操作,停留时间较短,通常会快速切换到活跃或后台状态。

3.活跃(Active):应用处于前台,正常接收用户事件,执行代码,是应用最常见的状态(如用户正在使用APP浏览内容、操作控件)。

4.后台(Background):应用被切换到后台,仍可执行少量代码(默认最多30秒),若需长时间在后台执行任务,需申请后台权限(如音乐播放、定位应用)。

5.挂起(Suspended):应用在后台完成任务后,系统会将其挂起,此时应用不执行任何代码,不占用CPU资源,但仍占用内存,当系统内存不足时,会优先释放挂起的应用。答案:

CoreData和SwiftData均是iOS中的数据持久化框架,核心区别在于语法、兼容性和使用复杂度:

1.语法差异:CoreData基于Objective-C和Swift混合语法,需手动创建数据模型(.xcdatamodeld)、托管对象上下文(NSManagedObjectContext)等,代码繁琐;SwiftData是iOS17+新增的框架,基于Swift语法,使用@Model修饰结构体即可定义数据模型,无需手动管理上下文,语法更简洁。

2.兼容性:CoreData支持iOS3.0+,兼容性强,适用于所有iOS版本的项目;SwiftData仅支持iOS17+,仅适用于最新系统版本的项目。

3.功能:两者核心功能一致,均可实现数据的增删改查、缓存、事务管理,但SwiftData新增了与SwiftUI的无缝集成,支持异步查询、批量操作等更便捷的功能。

选择建议:2026年开发中,若项目最低支持iOS17+,优先使用SwiftData,简化开发流程,提升效率;若项目需兼容iOS17以下版本,仍使用CoreData,保证兼容性。答案:

常见内存泄漏场景:

1.循环引用:block/闭包与对象强引用相互持有(如控制器中定义闭包,闭包中强引用self,且控制器持有该闭包);delegate使用强引用(未用weak修饰)。

2.未及时释放资源:定时器(NSTimer)未invalidate,导致定时器持有控制器,无法释放;通知未移除观察者,导致观察者无法释放。

3.长期持有对象:单例中强引用其他对象,且该对象无需长期存在;全局变量持有大量数据,未及时清空。

排查与解决方法:

1.排查工具:使用Xcode的Instruments(Leaks工具),可直观查看内存泄漏的对象和位置;通过Xcode的MemoryGraph(内存图),查看对象的引用关系,定位循环引用。

2.解决方法:

-循环引用:闭包中使用weakself(或unownedself);delegate使用weak修饰。

-未释放资源:定时器在不需要时调用invalidate()并置为nil;通知在控制器销毁时移除观察者。

-长期持有对象:单例中使用weak引用非必要对象;及时清空全局变量中的数据,避免长期占用内存。

五、代码题(每题10分,共20分)答案:

```swift

importUIKit

classTableViewController:UIViewController{

//定义表格控件

privatelettableView=UITableView(frame:.zero,style:.plain)

//定义数据源数组

privateletdataList=(1...100).map{"数据\($0)"}

//单元格重用标识

privateletcellReuseId="DataCell"

overridefuncviewDidLoad(){

super.viewDidLoad()

setupTableView()

}

//配置表格

privatefuncsetupTableView(){

//设置表格frame(与控制器视图一致)

tableView.frame=view.bounds

//设置数据源和代理

tableView.dataSource=self

tableView.delegate=self

//注册单元格(重用优化)

tableView.register(UITableViewCell.self,forCellReuseIdentifier:cellReuseId)

//将表格添加到视图

view.addSubview(tableView)

}

}

//实现UITableViewDataSource协议

extensionTableViewController:UITableViewDataSource{

//返回分区数(默认1个分区)

funcnumberOfSections(intableView:UITableView)->Int{

return1

}

//返回每个分区的单元格数量

functableView(_tableView:UITableView,numberOfRowsInSectionsection:Int)->Int{

returndataList.count

}

//返回单元格(重用优化核心)

functableView(_tableView:UITableView,cellForRowAtindexPath:IndexPath)->UITableViewCell{

//重用单元格,避免重复创建

letcell=tableView.dequeueReusableCell(withIdentifier:cellReuseId,for:indexPath)

//设置单元格内容

cell.textLabel?.text=dataList[indexPath.row]

returncell

}

}

//实现UITableViewDelegate协议(处理单元格点击)

extensionTableViewController:UITableViewDelegate{

functableView(_tableView:UITableView,didSelectRowAtindexPath:IndexPath){

//取消单元格选中状态

tableView.deselectRow(at:indexPath,animated:true)

//获取当前单元格数据

letdata=dataList[indexPath.row]

//弹出提示框

letalert=UIAlertController(title:"提示",message:"你点击了:\(data)",preferredStyle:.alert)

alert.addAction(UIAlertAction(title:"确定",style:.default))

present(alert,animated:true)

}

}

```

解析:核心亮点的是单元格重用(dequeueReusableCell),避免每次滚动都创建新单元格,减少内存开销;实现数据源和代理协议,完成列表数据展示和点击事件处理,符合实际开发规范。

答案:

```swift

importUIKit

classImageDownloadViewController:UIViewController{

//定义图片显示控件

privateletimageView=UIImageView(frame:CGRect(x:50,y:100,width:300,height:300))

overridefuncviewDidLoad(){

super.viewDidLoad()

view.backgroundColor=.white

//配置图片视图

imageView.contentMode=.scaleAspectFit

view.addSubview(imageView)

//调用下载图片方法

downloadImage()

}

//异步下载图片

privatefuncdownloadImage(){

//自定义图片URL(可替换为真实图片URL)

guardletimageUrl=URL(string:"/test.jpg")else{

showError(message:"图片URL无效")

return

}

//使用GCD在后台线程执行下载任务

DispatchQueue.global().async{[weakself]in

do{

//下载图片数据

letimageData=tryData(contentsOf:imageUrl)

//将数据转换为UIImage

guardletimage=UIImage(data:imageData)else{

throwNSError(domain:"ImageDownloadError",code:1,userInfo:[NSLocalizedDescriptionKey:"图片解析失败"])

}

//切换到主线程更新UI(UI操作必须在主线程执行)

DispatchQueue.main.async{

self?.imageView.image=image

}

}catch{

//下载失败,主线程显示错误提示

DispatchQueue.main.async{

self?.sh

温馨提示

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

评论

0/150

提交评论