iOS经典面试题大全2021(一)(附答案)

本文整理了2021年iOS面试中的经典问题,涵盖了设计模式、多线程、KVC/KVO、语言特性、数据持久化、网络请求等方面的知识,详细解答了包括代理模式的一对多通信、多线程的实现方式、KVO原理、数组和字典的操作注意事项等,旨在帮助iOS开发者准备面试。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(iOS面试资料大全)

1、简述你项目中常用的设计模式。它们有什么优缺点?

常用的设计模式有:代理、观察者、单例。

(1)单例:它是用来限制一个类只能创建一个对象。这个对象中的属性可以存储全局共享的数据。所有的类都能访问、设置此单例中的属性数据。

优点:是它只会创建一个对象容易供外界访问,节约性能。

缺点:是一个类只有一个对象,可能造成责任过重,在一定程度上违背了“单一职责原则”。单例模式中没有抽象层,所以单例类的扩展有很大的困难。不能过多创建单例,因为单例从创建到程序关闭前会一直存在,过多的单例会影响性能,浪费系统资源。

(2)观察者(KVO):它提供了观察某一属性变化的方法。当指定对象的属性发生改变后,它会自动通知相应的观察者。

优点:能提供被观察者属性的新值与旧值。用keypaths来观察属性,因此也可以观察嵌套对象。

缺点:需要注册观察者,实现observeValueForKeyPath:方法,属性可以通过KVC的方法来修改。否则观察者收不到通知。

(3)代理:可以实现类与类之间一对一的通信。

优点:代理协议方法都有清晰的定义。代理方法可以设置可选或必须实现。

缺点:需要定义协议方法,需要设置代理对象,代理对象实现协议方法。内存管理方面,需要注意循环引用问题。

2、代理模式能否实现一对多的通信?

可以,采用多播委托的方式来实现。多播委托:它是指允许创建方法的调用列表或者链表的能力。当多播委托被调用时,列表中的方法均自动执行。

普通代理只能是一对一的回调,无法做到一对多的回调,而多播委托正式对delegate的一种扩展与延伸,多了一个注册和取消的过程。任何需要回调的对象都必须先注册。

3、 重复注册通知会有问题吗?

不会出现问题,若多次发送同一通知,对方就会多次响应。如果重复注册通知,也会有多次响应的效果。为了避免重复注册通知而造成的错误,建议每次注册一个通知前,可以移除一次该通知。

4、项目中是否用过多线程编程?简述你常用的多线程实现方式?

常用的是GCD。

GCD是苹果开发中一个多核编程的解决方案。GCD的队列分为两种类型,SerialDispatchQueue与ConcurrentDispatchQueue。系统默认提供了一个dispatch_get_main_queue,一个dispatch_get_global_queue。

5、简述NSOperationQueue与GCD的区别。

(1) GCD是底层的C语言构成的API。NSOperationQueue及相关对象是Objc对象。在GCD中,在队列中执行的是由block构成的任务,这是一个轻量级的数据结构。而Operation作为一个对象,为我们提供了更多的选择。

(2) 在NSOperationQueue中,我们可以取消任务,而GCD没法停止已经加入queue的block。

(3) NSOperation能够方便的设置依赖关系。还能设置NSOperation的priority优先级,能够使同一个并行队列中的任务区分先后地执行。在GCD中,我们只能区分不同任务队列的优先级,如果要区分block任务优先级也需要大量复杂代码。
NSOperation还可以设置并发数。

6、实现多线程有哪几种方式?

(1)NSThread:detachNewThreadSelector:

(2)继承NSOperation

(3)GCD:dispatch_async

(4)NSObject:performSelectorInBackground:

7、KVC、KVO是什么?简述KVO的实现原理。KVO能否监听数组?如何实现?

KVC:键值编码,它是一种间接访问对象实例变量机制,可以不通过存取方法访问对象的实例变量。

KVO:键值观察,它可以使对象获取其他对象属性变化的通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值