iOS基本功iOS扩展iOS面试题

iOS常用设计模式总结

2019-03-01  本文已影响6人  阿凡提说AI

很多刚入门的iOS开发者经过短期训练,都可以熟练的调用API,这时候,写一个tableView,实现一个小动画,独立完成一个交互的功能,已经不在话下。但同时,iOS开发者也会遇到技术上的第一个瓶颈——即拥有独立开发一个功能的水平,却似乎并未达到独立开发一个App的水平;看似什么都会做,什么都能做,却总是不能在第一时间想到最佳方案;功能是完成了,然而效率并不高,代码逻辑在日后也可能需要返工重构。
我认为,突破这个瓶颈的捷径就是掌握设计模式。设计模式是前人总结的。面对开发中常见问题的解决方案——它们行之有效,便于理解,适合举一反三。简单点儿说,设计模式就是程序开发的套路和模板。熟练掌握设计模式,可以提高开发效率,节省开发时间。这样,我们就可以站在前人的肩膀上,去研究、解决那些具有挑战性和未曾解决过的问题。

一、平常开发中用到的设计模式

iOS开发中的设计模式有很多,一般常见的有以下7种。

二、什么是MVC?

MVC,即Model-View-Controller。它是苹果公司官方推荐的App开发架构,也是一般开发者最先遇到,最经典的架构。它把整个App分为三个部分:Model负责处理数据;View负责处理UI;Controller是View和Model的桥梁,它将数据从Model层传送到View层并展示出来,同时将View层的交互传到Model层以改变数据。相比传统的MVC,苹果的MVC的特点是,Model层和View层是相互独立的。
由于Controller承担的任务相对较重,在实际开发中,很多初级开发者直接将View和Controller部分的代码全部塞到了ViewController类中,造成了它们的高度耦合。如何解耦View和Controller,在iOS开发中使一个热门的话题。

三、OC和Swift在单例模式的创建上有什么区别?

单例模式在创建过程中,要保证实例变量只被创建一次。在整个开发中需要特别注意线程安全,即使在多线程情况下,依然只初始化一次变量。
在OC中使用GCD来保证这一点的。示例代码如下:

+ (instanceType)sharedManager {
   static Manager *sharedManager = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken,  ^{
        shareManager = [[Manager alloc] init];
    });
    return sharedManager;
}

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

class Manager {
  static let shared = Manager()
  private init() {}
}

四、什么是装饰模式

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

注意,delegate一般被声明为weak,以防止循环引用。

五、什么是观察者模式(Observer)

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

2.KVO
KVO,Key-Value Observer,即键值观察。它是一种没有通知中心的观察者模式的实现方式。一个主体对象管理所有依赖于它的观察者对象,并且在自身状态发生改变时主动通知观察者对象。KVO是一个纯OC的概念,Swift当前没有很好的动态机制,而且目前只有NSObject才支持KVO.它的具体实现步骤如下。
(1)注册观察者
(2)更改主题对象属性的值,即触发发送更改的通知。
(3)在制定的回调函数中,处理收到的更改通知。
在Swift 4中,我们不需要再手动的回收observer了。同时配合NSKeyValueObservation,我们可以更简单地使用KVO了,下面是示例代码:

// 在Swift4中,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"

六、什么是备忘录模式(Memento)

备忘录模式是一种保存对象当前的状态,并在日后可以恢复的模式。注意它不会破坏对象的封装,也就是说,私有对象也能保存下来。
备忘录模式最经典的使用方法就是用UserDefaults来读写,同时配合栈可以存储一系列状态。它经常用于初始化、重启、App前后台状态改变等场景。

上一篇 下一篇

猜你喜欢

热点阅读