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