iOS中的单例创建
来源:互联网 发布:java中重写和重载 编辑:程序博客网 时间:2024/06/06 11:43
很多人实现单例会这样写:
@implementation XXClass+ (id)sharedInstance { static XXClass *sharedInstance = nil; @synchronized(self) { if (!sharedInstance) { sharedInstance = [[self alloc] init]; } } return sharedInstance;}
相比之下:
@implementation XXClass+ (id)sharedInstance { static XXClass *sharedInstance = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (!sharedInstance) { sharedInstance = [[self alloc] init]; } }); return sharedInstance;}
使用dispatch_once可以简化代码并且彻底保证线程安全,开发者无需担心加锁或同步。此外,dispatch_once更高效,它没有使用重量级的同步机制,若是那样做的话,每次运行代码前都要获取锁。相反,此函数采用“原子访问”来查询标记,以判断其所对应的代码原来是否已经执行过。在64位Mac OS X上测试,后者的执行速度要比前者快一倍。
原文地址:http://www.jianshu.com/p/e03aa66a197f
也有各种别的写法,大同小异
static DistributeData *_distributeData = nil;@implementation DistributeData+ (DistributeData *)shareData{ @synchronized(self) { if (_distributeData==nil) { _distributeData = [[DistributeData alloc] init]; } } return _distributeData;}
dispatch_once_t是 一种多线程技术 这个是只执行一次 一般用来写单例
+(dispatch_queue_t)getqueue{ static dispatch_queue_t queue ; static dispatch_once_t Token; dispatch_once(&Token,^{ queue = dispatch_queue_create("name", NULL); }); return queue;}//或者+(dispatch_queue_t)getqueue{ static dispatch_queue_t queue=nil ; static dispatch_once_t Token; dispatch_once(&Token,^{ if (!queue) { queue = dispatch_queue_create("name", NULL); } }); return queue;}
阅读全文
0 0
- iOS中的单例创建
- iOS 创建单例
- iOS 单例创建
- iOS 创建单例
- iOS单例创建
- iOS 创建单例
- iOS 创建单例
- iOS中的单例
- iOS中的单例
- iOS中的单例
- iOS中的单例
- iOS中的单例
- 单例模式在iOS中的应用——三种创建单例方法对比
- iOS - ARC创建单例
- iOS 如何创建单例
- iOS OC 创建单例
- iOS中创建单例
- iOS快速创建单例
- google浏览器设置不缓存的方法
- eclipse+Maven安装和配置
- 编程语言浅述
- Android性能优化
- STL方法中,resize()和reserve()的区别和用途
- iOS中的单例创建
- LeetCode 520. Detect Capital (字符串)
- 正则表达式快速入门
- Dubbo各种协议
- Java的四种线程池的使用
- INFORMATION_SCHEMA获取数据库的信息
- 2017值得参加的人工智能大会
- Kotlin系列一(基本语法)
- MySQL