博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用dispatch_once创建单例
阅读量:6286 次
发布时间:2019-06-22

本文共 1452 字,大约阅读时间需要 4 分钟。

hot3.png

无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有UIApplicationNSApplication.

什么是单例呢?Wikipedia是如此定义的:

在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。

或者我的理解是:

单例是一种类,该类只能实例化一个对象。

    尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如NSFileMangerNSNotificationCenter,分别通过它们的类方法defaultManagerdefaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。

    使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了(Mac OS 10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。

    该函数就是dispatch_once

void dispatch_once( dispatch_once_t *predicate, dispatch_block_t block);

    该函数接收一个dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。

dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如 之类的来防止使用多个线程或者队列时不同步的问题。

    Apple的证实了这一点:

如果被多个线程调用,该函数会同步等等直至代码块完成。

    实际要如何使用这些呢?

    好吧,假设有一个AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:

+ (AccountManager *)sharedManager { 
    static AccountManager *sharedAccountManagerInstance = nil; 
    static dispatch_once_t predicate; dispatch_once(&predicate, ^{       
          sharedAccountManagerInstance = [[self alloc] init]; 
    });
    return sharedAccountManagerInstance; 
}

    这就意味着你任何时候访问共享实例,需要做的仅是:

AccountManager *accountManager = [AccountManager sharedManager];

    就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。

    该方法有很多优势: 

           1 线程安全

           2 很好满足静态分析器要求

           3 和自动引用计数(ARC)兼容 

           4 仅需要少量代码

    该方法的劣势就是它仍然运行创建一个非共享的实例:

AccountManager *accountManager = [[AccountManager alloc] init];

    有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。

转载于:https://my.oschina.net/u/1432769/blog/375576

你可能感兴趣的文章
程序员修炼之道读后感2
查看>>
DWR实现服务器向客户端推送消息
查看>>
js中forEach的用法
查看>>
Docker之功能汇总
查看>>
!!a标签和button按钮只允许点击一次,防止重复提交
查看>>
(轉貼) Eclipse + CDT + MinGW 安裝方法 (C/C++) (gcc) (g++) (OS) (Windows)
查看>>
还原数据库
查看>>
作业调度框架 Quartz.NET 2.0 beta 发布
查看>>
mysql性能的检查和调优方法
查看>>
项目管理中的导向性
查看>>
Android WebView 学习
查看>>
(转)从给定的文本中,查找其中最长的重复子字符串的问题
查看>>
HDU 2159
查看>>
spring batch中用到的表
查看>>
资源文件夹res/raw和assets的使用
查看>>
UINode扩展
查看>>
LINUX常用命令
查看>>
百度云盘demo
查看>>
概率论与数理统计习题
查看>>
初学structs2,简单配置
查看>>