iOS單例模式學習

單例模式通常有兩種:懶漢式和餓漢式

區別:

懶漢式:

第一次用到單例對象時 再創建單例對象。

餓漢式:

餓漢式:一進入程序就創建。

在iOS開發中爲了節約資源因此推薦使用懶漢式。


iOS中懶漢式使用的一般過程:

1、頭文件中自定義一個shareInstance類方法用來返回單例對象

2、實現文件中重寫allocwithzero方法,返回要執行單例的對象(對象爲全局的static對象)

3、在allwithzero的方法中判斷單例對象是否爲nil,爲nil則執行

4、在執行方法中使用同步鎖(鎖對象爲self)

5、在同步鎖中判斷是否爲空(防止多線程創建)

6、判斷爲空則通過super的allockwithzone新建一個對象

7、若要使用copy,則遵守nscoping,並且在copy方法中返回單例對象

8、單例對象的獲取通過我們自己定義的shareInstance方法獲取,同樣在shareInstance方法中執行兩次非空判斷,第二次非空判斷要加鎖,並且在第二次判斷中通過alloc init創建對象(其實就是調用allocwithzone)


代碼:

.h文件


+(instancetype)sharedInstance;


.m文件


static id _instance;

+(instancetype)sharedInstance

{


    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        _instance = [[self alloc]init];

    });


    return _instance;

}


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

{

    

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

         _instance = [super allocWithZone:zone];

    });

    return _instance;

}


-(id)copyWithZone:(NSZone *)zone

{

    return _instance;

}



PS:在非ARC環境下,爲了防止單例對象被回收,應該在實現文件中重寫以下四個方法:

- (oneway void)release{ }

- (id)retain { returnself; }

- (NSUInteger)retainCount { return1;}

- (id)autorelease { returnself;}




發佈了26 篇原創文章 · 獲贊 7 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章