iOS中使用dispatch_once实现单例及注意事项

单例模式实现方式是在类中编写名为sharedInstance的方法,该方法只会返回全类共用的单例实例,而不会在每次调用时都创建新的实例。


 使用同步块实现:

+ (id)sharedInstance {

    static ClassName *sharedInstance = nil;

    @synchronized (self) {

        if (!sharedInstance) {

            sharedInstance = [[self alloc]init];

        }

    }

    return sharedInstance;

}


GCD引入了一个新特征,更为方便:

+ (instancetype)sharedInstance {

    static ClassName *sharedInstance = nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        sharedInstance = [[self alloc]init];

    });

    return sharedInstance;

}

使用dispatch_once的注意事项:

    此函数接收类型为dispatch_once_t的特殊参数,还有一个块参数。对于onceToken标记,该函数保证相关的块必定会执行,且执行一次。此操作完全是线程安全的。注意:对于只执行一次的块来说,对于传入函数的标记参数必须完全相同,因此,开发时需要将标记变量声明在staticglobal作用于中。

对于在dispatch_once中的创建的实例对象必须确保其只有一个,所以使用static修饰

    上述两种实现单例的方法比较:使用dispatch_once可以简化代码且保证线程安全,开发者无需担心加锁或同步。所有问题都在GCD底层处理。此外,dispatch_once更高效。它没有使用重量级的同步机制。使用同步机制,每次运行代码都需要获取锁。dispatch_once采用原子访问来查询标记,判断代码是否执行过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值