Objective-C实现单例模式

refs:

http://blog.sina.com.cn/s/blog_5fde608901019ocr.html


对于_dispatch_once函数,只调用一次,常用于单例的创建:

+(SVProgressHUD*)sharedView{

   static dispatch_once_t once;

    static SVProgressHUD *sharedView;

    dispatch_once(&once, ^ {sharedView = [[SVProgressHUDalloc] initWithFrame:[[UIScreen mainScreen] bounds]]; });

    return sharedView;

}


dispatch_once_t变量只是标识_dispatch_once的执行情况,当once已经被使用时,dispatch_once方法将不执行内容;
因为once和sharedView都是静态的,故sharedView方法每次被执行时始终保持上一次结果,故实现单例效果。

使用Objective-C实现单例模式的最佳方式向来有很多争论,开发者(包括Apple在内)似乎每几年就会改变他们的想法。当Apple引入了GrandCentral Dispatch (GCD)(Mac OS10.6和iOS4.0),他们也引入了一个很适合用于实现单例模式的函数。

      该函数就是 dispatch_once
void dispatch_once( dispatch_once_t *predicate, dispatch_block_tblock);
      该函数接收一个 dispatch_once用于检查该代码块是否已经被调度的谓词(是一个长整型,实际上作为 BOOL使用)。它还接收一个希望在应用的生命周期内仅被调度一次的代码块,对于本例就用于shared实例的实例化。
dispatch_once不仅意味着代码仅会被运行一次,而且还是线程安全的,这就意味着你不需要使用诸如 @synchronized之类的来防止使用多个线程或者队列时不同步的问题。
      Apple的 GCDDocumentation证实了这一点:
如果被多个线程调用,该函数会同步等等直至代码块完成。
      实际要如何使用这些呢?
      好吧,假设有一个 AccountManager类,你想在整个应用中访问该类的共享实例。你可以按如下代码简单实现一个类方法:
+ (AccountManager *)sharedManager { 
      staticAccountManager *sharedAccountManagerInst ance =nil; 

      staticdispatch_once_t predicate;dispatch_once(&predicate,^{             
                  sharedAccountManagerInst ance = [[self alloc]init]; 
      });

    returnsharedAccountManagerInst ance; 

}
      这就意味着你任何时候访问共享实例,需要做的仅是:
AccountManager *accountManager = [AccountManagersharedManager];
      就这些,你现在在应用中就有一个共享的实例,该实例只会被创建一次。
      该方法有很多优势: 
                    1 线程安全
                    2 很好满足静态分析器要求
                    3 和自动引用计数(ARC)兼容 
                    4 仅需要少量代码
      该方法的劣势就是它仍然运行创建一个非共享的实例:
AccountManager *accountManager = [[AccountManager alloc]init];
      有些时候你希望有这种行为,但如果正在想要的是仅一个实例被实例化就需要注意这点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值