1、典型的单例写法

1 static id sharedMyManager;
2 +(id)shareThemeManager{
3     if(sharedThemeManager == nil){
4              shareMyManager = [[self alloc]init];
5     }
6   return sharedMyManager;
7 }

缺点:无法保证多线程情况下只创建一个对象。适用于只有单线程。

 

2、加锁的写法:

 1 static sharedManager* single = nil;
 2 
 3 +(sharedManage*)sharedManage{
 4 
 5     @synchronized(self){   //加锁,保证多线程下也只能有一个线程进入
 6 
 7         if (!single) {
 8 
 9             single = [[self alloc]init];
10 
11         }
12 
13     }
14 
15     return single;
16 
17 }

这种方法较常用。

3、GCD写法:

static sharedManager * single = nil;
+(id)sharedManager{

     static dispatch_once_t once;

      dispatch_once(&once,^{
               single = [[self alloc]init];
});

return single;
}

 

 

4、免锁(Lock free)的写法:

 1 static sharedManager * single = nil;
 2 
 3     +(void)initialize{
 4  
 5      static BOOL initialized = NO;
 6  
 7      if (initialized == NO){
 8  
 9          initialized = YES;
10  
11          shareMyManager = [[self alloc]init];
12 
13           }
14  
15  }

单例全面的写法:

重载以下方法:

+(id)allocWithZone:(NSZone *)zone;

+(id)copyWithZone:(NSzone *)zone;

+(id)retain;

+(void)release; //单例里面重写单例不允许release,autorrelease,所以重写

+(void)autorelease;