dispatch_once优化代码性能
来源:互联网 发布:淘宝手机端在哪里开通 编辑:程序博客网 时间:2024/05/20 18:55
有些变量只需要初始化一次(如从文件中读取配置参数,读取设备型号等等),可以使用dispatch_once来进行读取优化,保证只调用API一次,以后就只要直接访问变量即可
范例如下:
static BOOL isTestMode;+ (BOOL)isTestMode{ static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSNumber* obj = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFResourceTest"]; isTestMode = [obj boolValue]; }); return isTestMode;}
无论是爱还是恨,你都需要单例。实际上每个iOS或Mac OS应用都至少会有UIApplication或NSApplication.
什么是单例呢?Wikipedia是如此定义的:
在软件工程中,单例是一种用于实现单例的数学概念,即将类的实例化限制成仅一个对象的设计模式。
或者我的理解是:
单例是一种类,该类只能实例化一个对象。
尽管这是单例的实际定义,但在Foundation框架中不一定是这样。比如NSFileManger和NSNotificationCenter,分别通过它们的类方法defaultManager和defaultCenter获取。尽管不是严格意义的单例,这些类方法返回一个可以在应用的所有代码中访问到的类的共享实例。在本文中我们也会采用该方法。
使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了Grand Central Dispatch (GCD)(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不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如@synchronized之类的来防止使用多个线程或者队列时不同步的问题。
Apple的GCD Documentation证实了这一点:
如果被多个线程调用,该函数会同步等等直至代码块完成。
实际要如何使用这些呢?
好吧,假设有一个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];
有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。
1 0
- dispatch_once 优化代码性能
- dispatch_once优化代码性能
- dispatch_once优化代码性能
- dispatch_once优化代码性能
- 如何使用dispatch_once优化代码性能
- 单例 -- dispatch_once优化代码性能
- java代码优化---->性能优化
- Android性能优化-代码优化
- C代码性能优化
- 优化java代码性能
- 性能优化之代码
- java代码性能优化
- 代码性能优化工具
- java代码性能优化
- 优化java代码性能
- 代码性能优化
- unity 代码性能优化
- java性能代码优化
- 黑马程序员 10 基础加强
- 并行HASH JOIN小表广播问题
- 前端需要知道的零碎小知识
- C++程序设计实践学材系列(20)——1.5 用循环解决问题
- 结构体字节对齐
- dispatch_once优化代码性能
- 关于ORA-01034和ORA-27101的一种解决方法
- PHP操作文件和文件夹类
- Solr与tomcat整合,并添加中文分词器
- SqlServer查询最近执行的语句
- HIT archive data格式的system.img解包
- C++ 智能指针详解
- 年终复盘,我的2012
- C++程序设计实践学材系列(19)——1.4.2 输出两数中大值程序的其他写法