iOS开发中的单例模式

简介

开发者应该经常看到单例模式这个设计模式,那什么是单例模式呢?

我们知道面向对象编程会生成很多实例,比如对于学生这个对象可能有小明、小红、小强等多个具体的学生对象,多个对象可以方便我们对不同的对象根据不同的需求进行操作。

那有没有只需要一个对象的时候呢?有的。

比如用户信息,大部分App都只允许同时只有一个用户登录,那么也就是说用户信息只会有一份,那如果我们要用对象的模式来管理用户信息,就应该保证整个App只有一个用户信息对象,否则如果存在多个的话,可能会出现改了这个对象的值,却读取了那个对象的值,造成数据不一致。

需要保证只有一个对象的情况还有很多,根据项目需求的不同一定有其用武之处。那么对于这种要求保证只有一个对象实例的设计模式,就称为单例模式,简明易懂是吧。

iOS开发中的实现

介绍完了单例模式是什么,现在看看怎么实现。

各个语言都有自己的单例模式,其实对于单例模式的实现,最根本的一点就在于保证全局只有一个对象实例。也就是说每次要使用的时候,如果还没创建过实例,那就创建,如果已经创建过了,那就直接获取之前创建过的。

根据上面的描述,很容易想到的一种方式是在创建的时候判断一下实例是否是 nil,如果是,表示还没创建实例,那就创建,如果不是 nil 了,说明之前已经创建过了,那就直接获取就好了。

这是一种方法,但其实判断是否为 nil 需要一定时间,虽然也不多,但是万一在这个时间之内创建了两个实例呢,尤其是在多线程的情况下。另一种更快的方式是使用一个BOOL型变量来作为判断的信号量,创建后就改变其值,每次调用时判断一下值就可以了,这会比判断 nil 要快一点,但依然不能完全保证。

那有没有可以保证绝对唯一的方法呢?有的,用 GCD 中的 dispatch_once 方法,就可以保证创建新实例的代码只执行一次,那么其创建的实例也就是全局唯一的实例了。

我们可以看看代码:

#import "Singleton.h"

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

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

+ (id)copyWithZone:(struct _NSZone *)zone {
    return [Singleton shareInstance];
}

上面的代码就是利用 dispatch_once 方法来保证其生成新实例的代码只执行一次,可以保证多线程的唯一性。

在 alloc 时,Objective-C 会调用 allocWithZone ,通过覆写它来返回单例。复制对象的时候也是通过覆写调用的 copyWithZone 方法来达到返回唯一单例的目的。

用上面的方法,就可以创建单例了。具体的用法,纯粹看各自的发挥,可以将一些常用的操作提取出来放在头文件中供调用,这样其实就能方便的获取和操作单例的内容了。


查看作者首页

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 其实iOS开发中的单例模式无非就是一个类创建的对象在程序中只有一个对象! iOS中的单例模式有分为赖汉式和饿汉式单...
    蘇哲炫爺阅读 2,833评论 0 3
  • 单例模式(SingletonPattern)一般被认为是最简单、最易理解的设计模式,也因为它的简洁易懂,是项目中最...
    成热了阅读 9,855评论 4 34
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,388评论 30 472
  • 1 单例模式的动机 对于一个软件系统的某些类而言,我们无须创建多个实例。举个大家都熟知的例子——Windows任务...
    justCode_阅读 5,319评论 2 9
  • 1 场景问题# 1.1 读取配置文件的内容## 考虑这样一个应用,读取配置文件的内容。 很多应用项目,都有与应用相...
    七寸知架构阅读 11,783评论 12 68