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 ];
}