ios中单例的写法和目的

单例目前一般有两种写法,我早期在ios4,5的时候,一般采用如下写法

方法一:

static XxxManager *shared = nil;  
   
+ (XxxManager *)sharedManager {  
    if (!shared)  {
        shared = [[self allocWithZone:NULL] init];  
    }
    return shared;  
}


随着ARC和GCD的广泛使用,现在单例的写法大都如此:

方法二:

+ (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

你可能感兴趣的:(IOS)