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");});

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

同时也用对她的怀念来惩罚自己。

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

相关文章:

你感兴趣的文章:

标签云: