標準的單例方法

標準的單例方法需要重寫 copyWithZone,allocWithZone,init,確保以任何方式創建出來的對象只有一個。

一個單例創建不嚴格造成了的問題。簡單說來就是在有的地方使用了alloc創建了多個實例,當然如果嚴格按照接口的方法調用是不會有問題的,但是如果項目碰到有不太熟悉的人使用時在處理時就會出現使用其它的方法來創建實例,比如說用alloc,這樣本打算使用相同的一個實例成了多個而達不到做這個模式的目的。

關於單例模式的實現主要是static調用後存儲空間不釋放的特性使得實例在程序的生命週期中保持唯一,根據這個特點,如果要解決前面的問題,可以在allocWithZone裏調用接口sharInstance方法,在copyWithZone裏直接返回實例,具體實現如下:

@implementation XNShareTool
/**
 步驟:
 1.一個靜態變量_inastance
 2.重寫allocWithZone, 在裏面用dispatch_once, 並調用super allocWithZone
 3.自定義一個sharedXX, 用來獲取單例. 在裏面也調用dispatch_once, 實例化_instance
 -----------可選------------
 4.如果要支持copy. 則(先遵守NSCopying協議)重寫copyWithZone, 直接返回_instance即可.
 */
/**第1步: 存儲唯一實例*/
static XNShareTool *_instance;

/**第2步: 分配內存孔家時都會調用這個方法. 保證分配內存alloc時都相同*/
+(id)allocWithZone:(struct _NSZone *)zone{
    //調用dispatch_once保證在多線程中也只被實例化一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

/**第3步: 保證init初始化時都相同*/
+(instancetype)sharedTool{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[XNShareTool alloc] init];
    });
    return _instance;
}

/**第4步: 保證copy時都相同*/
-(id)copyWithZone:(NSZone *)zone{
    return _instance;
}

@end

轉載地址:http://www.starming.com/index.php?v=index&view=80

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