1. 程式人生 > >建立單例的兩種方式(懶漢式&GCD)

建立單例的兩種方式(懶漢式&GCD)

懶漢式:

// 建立靜態全域性變數
static id instance;

// 重寫allocWithZone方法
+(instancetype)allocWithZone:(struct _NSZone *)zone
{

    if (instance == nil) {
    // 如果物件為空,那麼再加鎖(防止頻繁加鎖)
        @synchronized(self) {
            if (instance == nil) {
            // 防止建立多次
                instance = [super allocWithZone:zone];
            }
        }
    }
    return
instance; } // 封裝一個初始化方法方便初始化物件的時候使用 +(instancetype)sharedLanHan { if (instance == nil) { @synchronized(self) { if (instance == nil) { instance = [[super alloc] init]; } } } return instance; } -(id)copyWithZone:(NSZone *)zone { // 防止copy時候產生新物件
return instance; }

GCD:

// 建立靜態全域性變數
static id _instance;

+(instancetype)allocWithZone:(struct _NSZone *)zone
{

    // GCD確保程式碼只執行一次,並且有執行緒保護
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{

        _instance = [super allocWithZone:zone];

    });

    return _instance;
}


+(id
)sharedGCD { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ _instance = [[super alloc] init]; }); return _instance; } -(id)copyWithZone:(NSZone *)zone { return _instance; }