单例模式是指系统中的一个类只有一个实例,并提供一个访问它的全局方法,常用的方法是将创建这个实例的操作隐藏在一个类操作中(即一个静态成员函数或者是一个类方法)
这个类可以保证没有其他实例可以被创建(通过截取创建对象的请求)
UML图
创建单例
方法一:
+ (instancetype)managerCenter {
static UserInfoManagerCenter *center = nil;
if (center == nil) {
center = [[UserInfoManagerCenter alloc] init];
}
return center;
}
缺点:如果多个地方同时调用这个函数,当同时进入这个函数的时候,center这个实例为空,会导致同时创建多个实例化类
方法二:
通过使用队列使请求不同时发生
+ (instancetype)managerCenter {
static UserInfoManagerCenter *center = nil;
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
center = [[UserInfoManagerCenter alloc] init];
});
return center;
}
编写更加严格的单例
1.防止其它的类调用创建单例的方法
2.防止通过调用init方法来创建类
+ (instancetype)managerCenter {
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
center = (UserInfoManagerCenter *)@"UserInfoManagerCenter";
center = [[UserInfoManagerCenter alloc] init];
});
// 防止子类使用
NSString *classString = NSStringFromClass([self class]);
if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {
NSParameterAssert(nil);
}
return center;
}
- (instancetype)init {
NSString *string = (NSString *)center;
if ([string isKindOfClass:[NSString class]] == YES && [string isEqualToString:@"UserInfoManagerCenter"]) {
self = [super init]; //通过调用[[UserInfoManagerCenter alloc] init]方法直接实例化变量返回nil
if (self) {
// 防止子类使用
NSString *classString = NSStringFromClass([self class]);
if ([classString isEqualToString:@"UserInfoManagerCenter"] == NO) {
NSParameterAssert(nil);
}
}
return self;
} else {
return nil;
}
}