設計模式 —— 單例模式
原理:系統中的類只有一個實例,且易於外界訪問
系統中的單例
[[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);
優缺點: 優:共享信息,管理中心;缺:破壞了封裝性