iOS —— Object-C 單例

static MyClass *class = nil;

@implementation MyClass

+(MyClass *)sharedMyClass{
    @synchronized(self){  //爲了確保多線程情況下,仍然確保實體的唯一性
        if (!class) {
            [[self alloc] init]; //該方法會調用 allocWithZone
        }
    }
    return class;
}
+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self){// //爲了確保多線程情況下,仍然確保實體的唯一性
        if (!class) {
            class = [super allocWithZone:zone]; //確保使用同一塊內存地址
            return class;
        }
    }
    return nil;
}

-(id)init
{
    if(class){
        return class;
    }
    if(self = [super init]){
        //進行一些初始化
    }
    return self ;
}
- (id)copyWithZone:(NSZone *)zone;{
    return self; //確保copy對象也是唯一
}

-(id)retain{
    return self; //確保計數唯一
}

- (unsigned)retainCount
{
    return UINT_MAX;  //裝逼用的,這樣打印出來的計數永遠爲-1
}

- (id)autorelease
{
    return self;//確保計數唯一
}

- (oneway void)release
{
    //重寫計數釋放方法 do nothing
}
@end

@interface SomeManager : NSObject  
+ (id)sharedManager;  
@end  
  
/* 非線程安全的實現 */  
@implementation SomeManager  
  
+ (id)sharedManager {  
    static id sharedManager = nil;  
  
    if (sharedManager == nil) {  
        sharedManager = [[self alloc] init];  
    }  
  
    return sharedManager;  
}  
@end  
  
/* 線程安全的實現 */  
@implementation SomeManager  
  
static id sharedManager = nil;  
  
+ (void)initialize {  
    if (self == [SomeManager class]) {  
        sharedManager = [[self alloc] init];  
    }  
}  
  
+ (id)sharedManager {  
    return sharedManager;  
}  
@end  


+(SchoolManager *)sharedInstance  
{  
    __strong static SchoolManager *sharedManager;  
      
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedManager = [[SchoolManager alloc] init];  
    });  
      
    return sharedManager;  
} 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章