设计模式 —— 单例模式
原理:系统中的类只有一个实例,且易于外界访问
系统中的单例
[[UIApplication sharedApplication] statusBarStyle];
[[NSNotificationCenter defaultCenter] addObserver:<#(nonnull id)#> selector:<#(nonnull SEL)#> name:<#(nullable NSNotificationName)#> object:<#(nullable id)#>];
[[NSUserDefaults standardUserDefaults] objectForKey:<#(nonnull NSString *)#>];
[NSFileManager defaultManager]
如何保证只创建一次:
1、防止继承;
2、保证只能创建一次(主要是解决alloc init问题)
static ManagerCenter *center = nil;
+ (instancetype)managerCenter {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
center = (ManagerCenter *)@"ManagerCenter";
center = [[ManagerCenter alloc] init];
});
//防止子类继承,直接崩溃
NSString *classStr = NSStringFromClass([self class]);
if (![classStr isEqualToString:@"ManagerCenter"]) {
NSParameterAssert(nil);
}
return center;
}
- (instancetype)init {
//防止init方法创建单例
NSString *classStr = (NSString *)center;
if ([classStr isKindOfClass:[NSString class]] == YES && [classStr isEqualToString:@"ManagerCenter"]) {
self = [super init];
if (self) {
//防止子类init方法继承
NSString *classStr = NSStringFromClass([self class]);
if (![classStr isEqualToString:@"ManagerCenter"]) {
NSParameterAssert(nil);
}
}
return self;
} else {
return nil;
}
}
解决的问题:
优化本地存储:FastCoding
注: 消除.m warning -fno-objc-arc
- (void)storeValue:(id)value withKey:(NSString *)key {
NSParameterAssert(value);
NSParameterAssert(key);
NSData *data = [FastCoder dataWithRootObject:value];
if (data) {
[[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
}
}
- (id)valueWithKey:(NSString *)key {
NSParameterAssert(key);
NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
return [FastCoder objectWithData:data];
}
使用分类优化存储过程
@interface NSObject (StoreValue)
- (void)storeValueWithKey:(NSString *)key;
+ (id)valueWithKey:(NSString *)key;
@end
#import "NSObject+StoreValue.h"
#import "ManagerCenter.h"
@implementation NSObject (StoreValue)
- (void)storeValueWithKey:(NSString *)key {
[[ManagerCenter managerCenter] storeValue:self withKey:key];
}
+ (id)valueWithKey:(NSString *)key {
return [[ManagerCenter managerCenter] valueWithKey:key];
}
@end
存储直接调用
[self.typeOne storeValueWithKey:@"FastCoding"];
TypeTwoMediator *model = [TypeTwoMediator valueWithKey:@"FastCoding"];
NSLog(@"%f",model.colleagueA.value);
优缺点: 优:共享信息,管理中心;缺:破坏了封装性