本文共 3387 字,大约阅读时间需要 11 分钟。
前言
1、GCD 方式创建
1.1 GCD 创建方式 1
- 下面的创建方式保证了用户除了可以通过 sharedManager 方法创建实例外,还可以通过 alloc、copy 方法创建不同的实例。
// SingleClass.h#import @property (nonatomic, copy)NSString *text;// 声明单例的类方法+ (instancetype)sharedManager;@end// SingleClass.m#import "SingleClass.h"@implementation SingleClass+ (instancetype)sharedManager{ // 创建静态单例类对象 static id instance = nil; // 执行且在整个程序的声明周期中,仅执行一次某一个 block 对象 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // 初始化单例类对象 instance = [[self alloc] init]; }); return instance;}@end// 单例类对象的调用// 创建单例类对象SingleClass *single1 = [SingleClass sharedManager];// 赋值single1.text = @"Hello World";// 取值NSString *string1 = [SingleClass sharedManager].text;
1.2 GCD 创建方式 2
- 下面的创建方式保证了用户不管是通过 sharedManager 方法,还是 alloc、copy 方法得到的实例都是一样的。
static id instance = nil;+ (instancetype)sharedManager { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [[self alloc] init]; }); return instance;}+ (instancetype)allocWithZone:(struct _NSZone *)zone { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ instance = [super allocWithZone:zone]; }); return instance;}- (id)copyWithZone:(NSZone *)zone { return instance;}- (id)mutableCopyWithZone:(NSZone *)zone { return instance;}
2、互斥锁方式创建
- 互斥锁会影响性能,所以最好还是使用 GCD 方式创建单例。
2.1 互斥锁 创建方式 1
- 下面的创建方式保证了用户除了可以通过 sharedManager 方法创建实例外,还可以通过 alloc、copy 方法创建不同的实例。
// SingleClass.h#import @property (nonatomic, copy)NSString *text;// 声明单例的类方法+ (instancetype)defaultManager;@end// SingleClass.m#import "SingleClass.h"@implementation SingleClass+ (instancetype)defaultManager{ // 创建静态单例类对象 static id instance = nil; // @synchronized 同一时刻,只能有一个线程来执行 {} 中的代码 @synchronized(self){ if (!instance) { // 初始化单例类对象 instance = [[self alloc] init]; } } return instance;}@end// 单例类对象的调用// 创建单例类对象SingleClass *single2 = [SingleClass defaultManager];// 赋值single2.text = @"Hello World";// 取值NSString *string2 = [SingleClass defaultManager].text;
2.2 互斥锁 创建方式 2
- 下面的创建方式保证了用户不管是通过 sharedManager 方法,还是 alloc、copy 方法得到的实例都是一样的。
static id instance = nil;+ (instancetype)defaultManager { @synchronized(self) { if (instance == nil) { instance = [[self alloc] init]; } } return instance;}+ (instancetype)allocWithZone:(struct _NSZone *)zone { @synchronized(self) { if (instance == nil) { instance = [super allocWithZone:zone]; } } return instance;}- (id)copyWithZone:(NSZone *)zone { return instance;}- (id)mutableCopyWithZone:(NSZone *)zone { return instance;}
转载于:https://www.cnblogs.com/CH520/p/9504953.html