单例设计
2019-05-12 本文已影响0人
黄定师
前言
单例(Singletons)在iOS开发中十分常见,比如系统的UIApplication,NSFileManager等均采用单例设计模式。在项目中,对很多全局共享的信息,我们也经常采用单例实现。虽然它们用起来十分方便,但实际上它们有许多问题需要注意。
按照《设计模式》书中的定义:单例模式是保证一个类仅有一个实例,并提供一个全局访问点去访问它。
单例实现
下面的代码主要解决的问题是:如果调用者不按照你的套路调用sharedInstance,而是调用new,alloc等方法获取实例,也要保证它们获取的是同一个实例,即一个类仅有一个实例。
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface HDSingleTon : NSObject
+ (instancetype)sharedInstance;
@end
NS_ASSUME_NONNULL_END
#import "HDSingleTon.h"
@implementation HDSingleTon
static id sharedInstance;
+ (instancetype)sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc]init];
});
return sharedInstance;
// 不采用下面这种方式:主要是防止每次调用shardInstance都进入allocWithZone,节省点资源
// return [[self alloc]init];
}
+ (instancetype)allocWithZone:(struct _NSZone *)zone {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [super allocWithZone:zone];
});
return sharedInstance;
}
// 防止copy出新的实例
- (id)copyWithZone:(NSZone *)zone {
return sharedInstance;
}
// 防止mutableCopy出新的实例
- (id)mutableCopyWithZone:(NSZone *)zone {
return sharedInstance;
}
@end