之前写过一篇怎么创建绝对单利,最近有了一个新的想法。
创建绝对单利的目的无非是不管用什么创建对象的方法,创建出来的对象始终是一个
创建绝对单例1的思路是将所有能够实例化对象的方法重新写一遍,保证对象不管调用什么方法也不能创建出第二个对象。
现在另外的想法就是,只给调用者暴露一个可以实例化对象的方法,让他其他的实例化方法调用不了
NS_UNAVAILABLE
& NSCAssert
的结合
NS_UNAVAILABLE
让方法调用不了
NSCAssert
让runtime的形式也调用不了
简单粗暴
#import <Foundation/Foundation.h>
@interface Single : NSObject
/// 单利创建方法
+ (instancetype)shareSingle;
// 不可用方法声明
- (instancetype)init NS_UNAVAILABLE;
+ (instancetype)new NS_UNAVAILABLE;
@end
#import "Single.h"
@implementation Single
+ (instancetype)shareSingle {
static Single *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[Single alloc] initXXX];
});
return single;
}
- (instancetype)initXXX
{
self = [super init];
if (self) {
}
return self;
}
#pragma mark- 避免通过runtime方法调用方法实现实例化
- (instancetype)init
{
NSCAssert(0, @"我是一个单利,不能调用init 方法欧");
return nil;
}
+ (instancetype)new
{
NSCAssert(0, @"我是一个单利,不能调用new 方法欧");
return nil;
}
@end
网友评论