写高质量OC代码52建议总结:45.使用dispatch_once来执行只需要运行一次的线程安全代码

本文介绍了如何利用GCD中的dispatch_once函数来创建线程安全的单例,对比了传统的@synchronized方法,强调dispatch_once的简洁和高效。通过示例代码展示了dispatch_once的使用方式,指出其关键在于静态变量和标记的正确设置。
摘要由CSDN通过智能技术生成
单例模式,该方法只会返回全类共用的单例实例,不会每次调用都创建新的实例。
@implementation EOCClass
 +(id)sharedInstance {
    static EOCClass *sharedInstance = nil;
    @synchronized(self) {
        if (!sharedInstance) {
            sharedInstance = [[self alloc] init];
        }
    }
    return sharedInstance;
 }
 @end
 GCD引入了一项新特性,实现单例更为容易。
void dispatch_once(dispatch_once_t *token, dispatch_block_t block);
 这个函数保证块必定会执行,而且只执行一次。这个操作完全是线程安全的。
 +(id)sharedInstance {
     static EOCCLass *sharedInstance = nil;
     stat icdispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
        sharedInstance = [[self alloc] init];
     });
     return sharedInstance;
 }
 dispatch_once可以简化代码,并且保证线程安全。每次调用都必须使用完全相同的标记dispatch_once_t,标记要证明成static。这个函数用“原子访问”查询标记,以判断代码是否已经执行过。后者比前者速度快一倍。
 
 总结:
 1.GCD提供的dispatch_once函数可以很容易实现单例。
 2.标记声明在static或global作用域中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值