1.该方法只能使用一个线程使用
缺陷: 当涉及到多线程时,会出现内存泄露问题,多个线程使用该方法时
会创建多个实例,而不是一个
//单例模式在OC中指的是 全局变量通常以sharedXXXX、currentXXX、defaultXXXX命名
+(id)sharedThemeManager;
@end
#import "ThemeManage.h"
static ThemeManage *instance;
@implementation ThemeManage
static ThemeManage *instance;
@implementation ThemeManage
+(id)sharedThemeManager{
if (instance==nil) {
//第一次进入调用 把s 存于全局变量中
instance= [[[self class]alloc] init];
if (instance==nil) {
//第一次进入调用 把s 存于全局变量中
instance= [[[self class]alloc] init];
}
//第二次 第三次。。。。都会使用第一次创建好的变量
return instance;
}
//第二次 第三次。。。。都会使用第一次创建好的变量
return instance;
}
2.使用加锁:即异步,就会限制方法使用范围,只能单个线程使用
@interface SharedManager : NSObject
+(id)sharedManager;
@end
+(id)sharedManager;
@end
#import "SharedManager.h"
static SharedManager *instance = nil;
@implementation SharedManager
+(id)sharedManager{
@synchronized(self){
if (!instance) {
instance = [[SharedManager alloc] init];
}
}
return instance;
}
static SharedManager *instance = nil;
@implementation SharedManager
+(id)sharedManager{
@synchronized(self){
if (!instance) {
instance = [[SharedManager alloc] init];
}
}
return instance;
}
@end
3.第一次实例化创建Lock Free,该方法是OC中提供给当类第一次被实例化时调用此方法,
设置一个初始值BOOL类型的,判断是不是第一次实例化
@interface SharedManager : NSObject
+(id)sharedManager;
@end
+(id)sharedManager;
@end
#import "SharedManager.h"
static SharedManager *instance = nil;
@implementation SharedManager
static SharedManager *instance = nil;
@implementation SharedManager
+(void)initialize{
static BOOL initialized = NO;
if (initialized == NO) {
initialized = YES;
instance = [[self alloc] init];
}
}
@end
4.GCD(Grand center Dispatch)该精度调度的写法
声明一个队列对象 Dispatch_once_t —>once
保证骑在任何时候在队列中只被创建一次
@interface SharedManager : NSObject
+(id)sharedManager;
@end
+(id)sharedManager;
@end
#import "SharedManager.h"
static SharedManager *instance = nil;
@implementation SharedManager
static SharedManager *instance = nil;
@implementation SharedManager
+(id)sharedManager{
static dispatch_once_t once;
dispatch_once(&once,^{
instance = [[self alloc] init];
});
return instance;
}
@end
5.全面写法就是重载所有系统函数
//单例全面写法
+(id)allocWithZone:(struct _NSZone *)zone{
return [super allocWithZone:zone];
}
+(id)copyWithZone:(struct _NSZone *)zone{
return [super copyWithZone:zone];
}
+(id)retain{
return [super retain];
}
+(void)release{
[super release];
}
+(void)autorelease{
[super autorelease];
}
+(id)allocWithZone:(struct _NSZone *)zone{
return [super allocWithZone:zone];
}
+(id)copyWithZone:(struct _NSZone *)zone{
return [super copyWithZone:zone];
}
+(id)retain{
return [super retain];
}
+(void)release{
[super release];
}
+(void)autorelease{
[super autorelease];
}