iOS之单例类两种实现

来源:互联网 发布:java加载类的过程 编辑:程序博客网 时间:2024/06/06 05:42

一 苹果官方文档的写法

static AccountManager *DefaultManager = nil;     + (AccountManager *)defaultManager {      if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init];      return DefaultManager;  }  


二 iOS4之后的一种写法

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

该写法来自 objcolumnist,文中提到,该写法具有以下几个特性:

1. 线程安全。

2. 满足静态分析器的要求。

3. 兼容了ARC

题外知识

关于dispatch_once:
1.这个方法可以在创建单例或者某些初始化动作时使用,以保证其唯一性。2.该方法是线程安全的,所以请放心大胆的在子线程中使用。(前提是你的dispatch_once_t *predicate对象必须是全局或者静态对象。这一点很重要,如果不能保证这一点,也就不能保证该方法只会被执行一次。)


0 0
原创粉丝点击