GCD高级用法(三) 多线程单例

众所周知,在oc,ui学习过程中,会碰到许多个系统的单例类,例如 [UIApplication sharedApplication]   [NSFileManager defaultManager] ...它们跟之前自己在没学多线程创建的单例类有什么区别呢。主要是系统提供的单例类在多线程下创建出来的对象依旧是不变的。之前没学多线程所创建的单例,在多线程状况下是不安全的,它们创建出来的对象并不是唯一的。那才能创建出多线程下的单例呢,话不多说,直接码上:



#import <Foundation/Foundation.h>

//多线程里单例 多个线程内只能实例化出一个对象副本

@interface GCDSingle : NSObject


+ (id)allocWithZone:(NSZone *)zone;

@end



#import "GCDSingle.h"

@implementation GCDSingle

//多线程里单例 多个线程内只能实例化出一个对象副本

static GCDSingle *SharedInstance=nil;

+ (id)allocWithZone:(NSZone *)zone
{
    static dispatch_once_t onceToken;
    
    dispatch_once(&onceToken, ^{
        
        SharedInstance =[super allocWithZone:zone];
        
    });
    
    return SharedInstance;
}

@end



接下来在GCD测试一下


   //创建监听组
    dispatch_group_t group=dispatch_group_create();
    
    //创建队列
    dispatch_queue_t queue=dispatch_get_global_queue(0,0);
    
    //并发任务,执行顺序随机(测试多线程单例)
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object1=[[GCDSingle alloc] init];
        NSLog(@"object1:%@",object1); //object1:<GCDSingle: 0x7fbc8be071c0>
    });
    
    
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object2=[[GCDSingle alloc] init];
        NSLog(@"object2:%@",object2); //object2:<GCDSingle: 0x7fbc8be071c0>
    });
    
    
    dispatch_group_async(group, queue, ^{
        
        GCDSingle *object3=[[GCDSingle alloc] init];
        NSLog(@"object3:%@",object3); //object3:<GCDSingle: 0x7fbc8be071c0>
 
    });

    dispatch_group_notify(group, queue, ^{NSLog(@"done");});


   从打印结果来看 对象副本地址都是一样的。这样跟系统单例一样安全,实用的单例就创建好了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值