很多刚入门的 iOS 开发者经过短期训练,可以熟练的调用各种 API。这时候写一个 tableView、实现一个小动画、独立完成一个交互的功能已经不在话下,但同时 iOS 开发者也就到了技术上的第一个瓶颈——即拥有独立开发一个功能的水平,却似乎并未达到独立开发一个 App 的水准;看似什么都会做、什么都能做,却似乎总是不能在第一时间想到最佳方案。功能是完成了,然而效率上不是很高,代码逻辑在日后也可能需要返工重构。
我个人认为,突破这个瓶颈的捷径就是掌握设计模式。设计模式是前人总结的、面对开发中常见问题的解决方案——它们行之有效、便于理解、适合举一反三。简单点说,设计模式就是开发中的套路和模板。熟练掌握设计模式,可以提高开发效率,节省开发时间。这样,我们就可以站在前人的肩膀上,去研究解决那些具有挑战性和未曾解决过的问题。
关键词:#创建型 #结构型 #行为型
iOS 开发中的设计模式有很多,一般最常见的有这 7 种:
如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群931 542 608来获取一份详细的大厂面试资料为你的跳槽多添一份保障。
我们可以把上面7种模式归类为以下3类:
关键词:#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 架构:
关键词:#线程安全
单例模式在创建过程中,要保重实例变量只被创建一次。整个开发中需要特别注意线程安全,即使在多线程情况下,依然只初始化一次变量。
Objective-C 中,是用 GCD 来保证这一点的。示例代码如下:
+ (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 关键词已经保证了实例变量不会被修改,所以单例的创建就简单很多:
class Manager {
static let shared = Manager()
private init() {}
}
关键词:#Category #Extension #Delegation
装饰模式是在不改变原封装的前提下,为对象动态添加新功能的模式。在 Objective-C 中,它的实现形式为 Category 和 Delegation;在 Swift 中,它的表现形式是 Extension 和 Delegation。
关键词:#通知 #KVO
观察者模是定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。在 iOS 开发中典型的推模型实现方式为通知和 KVO。
1) 观察者 Observer,通过 NotificationCenter 的 addObserver:selector:name:object 接口来注册对某一类型通知感兴趣。在注册时候一定要注意,NotificationCenter 不会对观察者进行引用计数 +1 的操作。
2) 通知中心 NotificationCenter,通知的枢纽。
3) 被观察的对象,通过 postNotificationName:object:userInfo: 发送某一类型通知,广播改变。
4) 通知对象 Notification,当有通知来的时候,Center 会调用观察者注册的接口来广播通知,同时传递存储着更改内容的 Notification 对象。
KVO 的全称是 Key-Value Observer,即键值观察。是一种没有中心枢纽的观察者模式的实现方式。一个主体对象管理所有依赖于它的观察者对象,并且在自身状态发生改变的时候主动通知观察者对象。KVO 是一个纯 Objective-C 的概念,Swift 当前没有很好的动态机制。而且目前只有 NSObject 才支持 KVO。它的具体步骤如下:
1) 注册观察者
2) 更改主题对象属性的值,即触发发送更改的通知。
3) 在制定的回调函数中,处理收到的更改通知。
在 Swift 4 中,我们不需要再手动的回收 observer 了。同时配合 NSKeyValueObservation 我们可以更简单的使用 KVO 了,下面是示例代码:
// 在 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"
关键词:#保存 #回复
备忘录模式是一种保存对象当前的状态,并在日后可以回复的模式。注意,它不会破坏对象的封装;也就是说,私有数据也能被保存下来。
其最经典的使用方法就是用 UserDefaults 来读写,同时配合栈可以存储一系列状态。它经常用于初始化、重启、App 前后台状态改变等地方。
iOS开发人群越来越少,说实在的,每次在后台看到一些读者的回应都觉得很欣慰,至少你们依然坚守iOS技术岗…为了感谢读者们,我想把我收藏的一些编程干货贡献给大家,回馈每一个读者,希望能帮到你们。
干货主要有:
① iOS中高级开发必看的热门书籍(经典必看)
② iOS开发技术进阶教学视频
③ BAT等各个大厂iOS面试真题+答案.PDF文档
④ iOS开发中高级面试"简历制作"指导视频
如果你用得到的话可以直接拿走;如何获取,具体内容请转看-我的GitHub
我的:GitHub地址
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。