IOS-dispatch_once和@synchronized的单例区别
2016-04-06 19:19
423 查看
dispatch_once和@synchronized的单例模式
我们在使用单例的时候往往会使用@synchronized,其实GCD也提供了一种方式。它的优点在于它使用block而非函数指针,这样代码更自然。我们平时使用的初始化往往是这样的
+ (id)sharedInstance { static Instance *obj = nil; @synchronized([Instance class]) { if(!obj) obj = [[Instance alloc] init]; } return obj; }
这样性能就不是很好,因为每次调用+ (id)sharedInstance函数都会付出取锁的代价。下面我们使用更加简洁的方式来实现:
+ (id)sharedInstance { static dispatch_once_t pred; static Instance *obj = nil; dispatch_once(&pred, ^{ obj = [[Instance alloc] init]; }); return obj; }
这样的方法有很多优势,首先满足了线程安全问题,其次很好满足静态分析器要求。GCD可以确保以更快的方式完成这些检测,它可以保证block中的代码在任何线程通过dispatch_once调用之前被执行,但它不会强制每次调用这个函数都让代码进行同步控制。实际上,如果你去看这个函数所在的头文件,你会发现目前它的实现其实是一个宏,进行了内联的初始化测试,这意味着通常情况下,你不用付出函数调用的负载代价,并且会有更少的同步控制负载。
因此,以后我们使用单例模式的时候尽量使用GCD。
相关文章推荐
- IOS设计模式-单例模式
- IOS-使用XCODE自带的单元测试UnitTest
- iOS下的WiFi开发
- iOS xib崩溃问题
- iOS 数组越界处理方法总结
- VI nagios
- ios开发——仿新版iBooks书本打开与关闭动画
- iOS通过SocketRocket实现websocket的即时聊天
- 【iOS和HTML 5交互】iOS中加载html5调用html方法和修改html5内容
- IOS开发之——reveal 的使用
- iOS推送证书过期解决办法。
- NSRegularExpression iOS自带的正则表达式
- iOS中的cookie简介和其中的坑
- IOS textField 输入个数限制
- iOS(使用pch文件导入头文件方法) 不用再import 这个pch文件就可以使用
- iOS开发------本地存储-NSKeyedArchiver & NSKeyedUnarchiver(归档)
- MLeaksFinder:精准 iOS 内存泄露检测工具
- ios之TableViewCell重用机制避免重复显示问题
- IOS contentOffset该如何理解
- iOS获取自1970年毫秒数