iOS设计模式之单例

2020/6/28 23:27:09

本文主要是介绍iOS设计模式之单例,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

定义

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

该模式在各类工程中很常见,单例类提供创建与访问类的唯一对象的访问点,并保证它唯一、一致而且为人熟知。

搭配其他模式

  • 工厂方法
  • 命令模式

使用场景

在以下情形时,可以考虑使用单例模式:

  • 类只能有一个实例,而且必须从一个为人熟知的访问点对其进行访问,比如工厂方法
  • 这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码。

类图结构

单例类图如下:

不同的客户端调用Singleton的shareInstance方法生成的只有唯一的一个Singleton对象。

代码实现

下面我们用代码实现单例方法

@interface XQSingleton : NSObject

+ (instancetype)shareInstance;

@end

@implementation XQSingleton

+ (instancetype)shareInstance{
    static XQSingleton *shareInstance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shareInstance = [[super allocWithZone:NULL] init];
    });
    return shareInstance;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    return [self shareInstance];
}

- (id)copy{
    return self;
}

- (id)mutableCopy{
    return self;
}

@end
复制代码

以上代码有以下几点一一展开说:

  • 在XQSingleton的@interface中声明shareInstance接口,提供给外部调用返回单例对象。
  • 在类实现中shareInstance使用static XQSingleton *shareInstance,这种静态局部对象是为了保持返回对象的唯一性。
  • 使用GCD的dispatch_once函数确保该对象的初始化方法只执行一次,保证了线程安全。
  • 初始化使用[super allocWithZone:NULL]是为了重载当前类的allocWithZone方法,只能使用父类的对象分配方法来创建对象。
  • 重载allocWithZone方法是为了防止外部调用alloc创建出另外一个新的XQSingleton对象。
  • 重载copy和mutableCopy方法时为了防止外部调用copy或者mutableCopy方法时,生成新的对象。

Cocoa Touch框架使用单例

  1. UIApplication 类 UIApplication单例类在框架中极为常用。它提供了一个控制并协调iOS应用程序的集中点。在应用程序中处理许多内务管理任务,包含传入的用户事件的最初路由,UIControl事件分发给合适的目标对象,维护应用程序中打开所有的UIWindow对象的列表等等。
  2. NSFileManager类 NSFileManager通过defaultManager类方法进行创建和访问文件系统。提供的统一的访问接口。

总结

只要应用程序需要用集中式的类来协调其服务,这个类就应生成单一的实例,而不是多个实例。



这篇关于iOS设计模式之单例的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程