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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值