標籤:
回顧一下load和initialize方法,有幾點需要注意。
load方法和initialize方法分析:
1、load方法:
1> 當類被引用進程式的時候會執行這個函數
2> 一個類的load方法不用寫明[super load],父類就會收到調用,並且在子類之前。
3> Category的load也會收到調用,但順序上在主類的load調用之後。
2、initialize方法:
1> initialize的自然調用是在第一次主動使用當前類的時候
2> 和load不同,即使子類不實現initialize方法,會把父類的實現繼承過來調用一遍。注意的是在此之前,父類的方法已經被執行過一次了,同樣不需要super調用。
3、load和initialize有很多共同特點,下面簡單列一下:
1> 在不考慮開發人員主動使用的情況下,系統最多會調用一次
2> 如果父類和子類都被調用,父類的調用一定在子類之前
3> 都是為了應用運行提前建立合適的運行環境
4> 在使用時都不要過重地依賴於這兩個方法,除非真正必要
由於initialize的這些特點,使得其應用比load要略微廣泛一些。可用來做一些初始化工作,或者單例模式的一種實現方案
4、單例模式
1> 概念
單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個執行個體而且該執行個體易於外界訪問,從而方便對執行個體個數的控制並節約系統資源。如果希望在系統中某個類的對象只能存在一個,單例模式是最好的解決方案。
2> 書寫步驟
(1)建立類方法,返回對象執行個體.以shared default current開頭。
(2)建立一個全域變數用來儲存對象的引用
(3)判斷對象是否存在,若不存在,建立對象
3> 非安全執行緒寫法
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
if (helper == nil) {
helper = [[UserHelper alloc] init];
}
return helper;
}
4> 安全執行緒寫法1
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
@synchronized(self) {
if (helper == nil) {
helper = [[UserHelper alloc] init];
}
}
return helper;
}
5> 安全執行緒寫法2
+ (void)initialize {
if ([self class] == [UserHelper class]) {
helper = [[UserHelper alloc] init];
}
}
6、安全執行緒寫法3(蘋果推薦,主要用這個)
static UserHelper * helper = nil;
+ (UserHelper *)sharedUserHelper {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
helper = [[UserHelper alloc] init];
});
return helper;
}
7、MRC全面實現單例寫法(瞭解)-- 這裡先不做介紹。
iOS開發-OC篇-單例模式