单例目前一般有两种写法,我早期在ios4,5的时候,一般采用如下写法
方法一:
static XxxManager *shared = nil;
+ (XxxManager *)sharedManager {
if (!shared) {
shared = [[self allocWithZone:NULL] init];
}
return shared;
}
方法二:
+ (XxxManager *)sharedManager
{
static XxxManager *sharedInstance = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
sharedInstance = [[self alloc] init];
});
return sharedInstance;
}
对比这两种写法,
第一种比较常规,符合C的习惯,也是曾经苹果的推荐写法。
第二种写法好处是用到了GCD的dispatch_once_t,这东西就是在多线程中用的,所以可以保证线程安全,同时这种方式也能很好的支持了ARC。
不过使用单例的时候需要注意:在单例初始化时,一定不能出现对单例的引用!否者会引起循环调用。
简单说就是不能在单例类的初始化的方法中,自身或者成员变量又对单例的变量或方法进行调用。
具体参考:http://www.cnblogs.com/sunnyxx/archive/2012/11/09/2762861.html