众所周知,在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");});
从打印结果来看 对象副本地址都是一样的。这样跟系统单例一样安全,实用的单例就创建好了。