使用GCD创建单例
在iOS开发过程中,需要使用到一些全局变量以及管理方法,可以将这些变量以及方法封装在一个管理类中,这是符合MVC开发模式的,这就需要使用单例(singleton)。
单例在整个程序中只需要创建一次,而其中的变量生命周期是在单例被使用时创建一直到程序结束后进行释放的,类似于静态变量,所以我们需要考虑到单例的生命周期,唯一性以及线程安全。在这里,我们需要实用GCD来创建唯一单例:
1.在.h文件中创建类方法 + (instancetype)Shareinstance;
2.在.m文件中创建全局变量 PerfectSingleton *manager = nil;
3.创建静态唯一线程变量 static dispatch_once_t onceToken;
4.判断全局变量是否创建,若未创建,使用GCD创建线程 dispatch_once(&onceToken, ^{ <#创建代码#> });
这里使用到GCD进行单例创建,考虑到了单例创建的线程安全,保证了单例在创建时的唯一性。
1 //PerfectSingleton.h 2 3 #import <Foundation/Foundation.h> 4 5 @interface PerfectSingleton : NSObject 6 7 + (instancetype)Shareinstance; 8 9 @end
1 // PerfectSingleton.m 2 3 #import "PerfectSingleton.h" 4 5 PerfectSingleton *manager = nil; 6 7 @implementation PerfectSingleton 8 9 + (instancetype)Shareinstance{ 10 if(!manager){ 11 static dispatch_once_t onceToken; 12 dispatch_once(&onceToken, ^{ 13 manager = [PerfectSingleton new]; 14 }); 15 } 16 return manager; 17 } 18 19 // 防止使用alloc开辟空间 20 + (instancetype)allocWithZone:(struct _NSZone *)zone{ 21 if(!manager){ 22 static dispatch_once_t onceToken; 23 dispatch_once(&onceToken, ^{ 24 manager = [super allocWithZone:zone]; 25 }); 26 } 27 return manager; 28 } 29 30 // 防止copy 31 + (id)copyWithZone:(struct _NSZone *)zone{ 32 if(!manager){ 33 static dispatch_once_t onceToken; 34 dispatch_once(&onceToken, ^{ 35 manager = [super copyWithZone:zone]; 36 }); 37 } 38 return manager; 39 } 40 41 // 使用同步锁保证init创建唯一单例 ( 与once效果相同 ) 42 - (instancetype)init{ 43 @synchronized(self) { 44 self = [super init]; 45 } 46 return self; 47 } 48 49 @end