iOS 面试策略之系统框架-设计模式

2021-05-19 18:09:34 浏览数 (1)

很多刚入门的 iOS 开发者经过短期训练,可以熟练的调用各种 API。这时候写一个 tableView、实现一个小动画、独立完成一个交互的功能已经不在话下,但同时 iOS 开发者也就到了技术上的第一个瓶颈——即拥有独立开发一个功能的水平,却似乎并未达到独立开发一个 App 的水准;看似什么都会做、什么都能做,却似乎总是不能在第一时间想到最佳方案。功能是完成了,然而效率上不是很高,代码逻辑在日后也可能需要返工重构。

我个人认为,突破这个瓶颈的捷径就是掌握设计模式。设计模式是前人总结的、面对开发中常见问题的解决方案——它们行之有效、便于理解、适合举一反三。简单点说,设计模式就是开发中的套路和模板。熟练掌握设计模式,可以提高开发效率,节省开发时间。这样,我们就可以站在前人的肩膀上,去研究解决那些具有挑战性和未曾解决过的问题。

1.说说你平常开发中用到的设计模式?

关键词:#创建型 #结构型 #行为型

iOS 开发中的设计模式有很多,一般最常见的有这 7 种:

  • MVC:是应用的一种基本架构,主要目的是将不同的代码归于不同的模块,做到低耦合、代码分配合理、易于扩展维护的目的。
  • 装饰模式(Decorator):它可以在不修改原代码的机场上进行拓展。注意它与继承最大的区别是:继承时,子类可以修改父类的行为,而装饰模式不希望如此。
  • 适配器模式(Adapter):将一个类的接口转化为另一个类的接口,使得原本互不兼容的类可以通过接口一起工作。
  • 外观模式(Façade):用一个公共接口来连接多个类或其他数据类型。公共接口让多个类互相之间保持独立,解耦性良好。同时使用接口时,外部无需理解其背后复杂的逻辑。另外就算接口背后的逻辑改变也不影响接口的使用。
  • 单例模式(Singleton):单例模式保证对于一个特有的类,只有一个公共的实例存在。它一般与懒加载一起出现,只有被需要时才会创建。单例模式的例子有 UserDefaults.standard,UIApplication.shared,UIScreen.main。
  • 观察者模式(Observer):定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。在 iOS 中的典型实现是 NotificationCenter 和 KVO。
  • 备忘录模式(Memento):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象回复到保存之前的状态。

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群931 542 608来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

我们可以把上面7种模式归类为以下3类:

  • 创建型 (Creational):单例模式 (Singleton)
  • 结构型 (Structural):MVC、装饰模式 (Decorator)、适配器模式 (Adapter)、外观模式 (Facade)
  • 行为型 (Behavioral):观察者模式 (Observer)、备忘录模式 (Memento)

2.什么是MVC?

关键词:#model #view #controller

MVC 是 Model-View-Controller 的简称。它是苹果官方推荐的 App 开发架构,也是一般开发者最先遇到的、最经典的架构。它把整个 App 分成了三个部分:Model 负责处理数据;View 负责处理 UI;Controller 是 View 和 Model 的桥梁,它将数据从 Model 传送到 View 层展示出来,同时将 View 层的交互传到 Model 层以改变数据。相比于传统的 MVC,苹果的 MVC 的特点是 Model 和 View 层是相互独立的。下图是苹果 MVC 架构的示意图:

imageimage

由于 Controller 承担的任务相对较重,实际开发中很多初级的开发者直接将 View 和 Controller 部分的代码全部塞到了 ViewController 类中,造成了它们的高度耦合。如何解耦 View 和 Controller,在 iOS 开发中是一个热门的话题。下图是实际开发中的 MVC 架构:

imageimage

3. Objective-C 和 Swift 在单例模式的创建上有什么区别?

关键词:#线程安全

单例模式在创建过程中,要保重实例变量只被创建一次。整个开发中需要特别注意线程安全,即使在多线程情况下,依然只初始化一次变量。

Objective-C 中,是用 GCD 来保证这一点的。示例代码如下:

代码语言:txt复制
  (instanceType)sharedManager {
  static Manager *sharedManager = nil;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedManager = [[Manager alloc] init];
  });
  return sharedManager;
}

如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群931 542 608来获取一份详细的大厂面试资料为你的跳槽多添一份保障。

在 swift 中,let 关键词已经保证了实例变量不会被修改,所以单例的创建就简单很多:

代码语言:txt复制
class Manager {
  static let shared = Manager()
  private init() {}
}

4. 什么是装饰模式(Decorator)?

关键词:#Category #Extension #Delegation

装饰模式是在不改变原封装的前提下,为对象动态添加新功能的模式。在 Objective-C 中,它的实现形式为 Category 和 Delegation;在 Swift 中,它的表现形式是 Extension 和 Delegation。

  • Category 的好处之一是可以给类增加新的方法,它也可以利用动态特性增加新的变量。同时,Category的出现也减轻了类的负担,我们可以利用它将代码分散开来。它的文件名一般为“类名 扩展名”
  • Extension 在 Swift 中的地位等同于 Category 在 Objective-C 中的地位。它更强大的地方在于可以为 Protocol 扩展完成默认实现。
  • Delegation 是程序中一个对象代表另一个对象,或者一个对象与另外一个对象协同工作的模式。一般配合 protocol 使用,例如 tableView 的 UITableViewDataSource 和 UITableViewDelegate 就是典型的 Delegation 模式。注意,delegate 一般声明为 weak 以防止循环引用。

5. 什么是观察者模式(Observer)?

关键词:#通知 #KVO

观察者模是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。在 iOS 开发中典型的推模型实现方式为通知和 KVO。

  • 通知(Notifications) imageimage

1) 观察者 Observer,通过 NotificationCenter 的 addObserver:selector:name:object 接口来注册对某一类型通知感兴趣。在注册时候一定要注意,NotificationCenter 不会对观察者进行引用计数 1 的操作。

2) 通知中心 NotificationCenter,通知的枢纽。

3) 被观察的对象,通过 postNotificationName:object:userInfo: 发送某一类型通知,广播改变。

4) 通知对象 Notification,当有通知来的时候,Center 会调用观察者注册的接口来广播通知,同时传递存储着更改内容的 Notification 对象。

  • KVO

KVO 的全称是 Key-Value Observer,即键值观察。是一种没有中心枢纽的观察者模式的实现方式。一个主体对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。KVO 是一个纯 Objective-C 的概念,Swift 当前没有很好的动态机制。而且目前只有 NSObject 才支持 KVO。它的具体步骤如下:

1) 注册观察者

2) 更改主题对象属性的值,即触发发送更改的通知。

3) 在制定的回调函数中,处理收到的更改通知。

在 Swift 4 中,我们不需要再手动的回收 observer 了。同时配合 NSKeyValueObservation 我们可以更简单的使用 KVO 了,下面是示例代码:

代码语言:txt复制
// 在 Swift 4 中,NSObject 的类不再自动被推断为 @objc,需要用 @objcMembers 来声明其Objective-c 特性
@objcMembers class User: NSObject {
  // dynamic关键词对于observe的闭包来讲是必须的
  dynamic var email: String

  init(email: String) {
    self.email = email
  }
}

let user = User(email:"user@hotmail.com")

// 注册观察email属性值,闭包中为若发生变化做出的相应处理
let observation = user.observe(.email) { (user, change) in
  print("User's new email: (user.email)" )
}

user.email = "user@outlook.com"

6. 什么是备忘录模式(Memento)?

关键词:#保存 #回复

备忘录模式是一种保存对象当前的状态,并在日后可以回复的模式。注意,它不会破坏对象的封装;也就是说,私有数据也能被保存下来。

其最经典的使用方法就是用 UserDefaults 来读写,同时配合栈可以存储一系列状态。它经常用于初始化、重启、App 前后台状态改变等地方。

文章到这里就结束了,感谢你的观看,只是有些话想对读者们说说:

iOS开发人群越来越少,说实在的,每次在后台看到一些读者的回应都觉得很欣慰,至少你们依然坚守iOS技术岗…为了感谢读者们,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。

干货主要有:

① iOS中高级开发必看的热门书籍(经典必看)

② iOS开发技术进阶教学视频

③ BAT等各个大厂iOS面试真题 答案.PDF文档

④ iOS开发中高级面试"简历制作"指导视频

如果你用得到的话可以直接拿走;如何获取,具体内容请转看-我的GitHub

我的:GitHub地址

0 人点赞