想定義個(gè)可變數(shù)組在編譯期初始化...正常全局狀態(tài)初始化我們一般這樣寫
static const NSInteger kSearchInterval = 10;
static NSString * const uartServiceUUIDString = @"6E400001-B5A3-F393-E0A9-E50E24DCCA9E";
但是可變數(shù)組不行,
static NSMutableArray *kSomeArray = [NSMutableArray new];```
這樣寫編譯器會(huì)報(bào)錯(cuò),告訴你不應(yīng)該在編譯期定義碍现。
既然不能在全局中定義石咬,放在方法里總可以了吧
點(diǎn)進(jìn)NSObject煤惩,找到兩個(gè)方法畜晰,研究下
(void)load;
(void)initialize;```
+ (void) load
對于加入運(yùn)行期系統(tǒng)中的每個(gè)類及分類來說喻犁,必定會(huì)調(diào)用此方法汽纤,而且僅調(diào)用一次上岗。當(dāng)包含類或分類的程序庫載入系統(tǒng)時(shí),就會(huì)執(zhí)行此方法蕴坪,就是應(yīng)用程序啟動(dòng)的時(shí)候肴掷。
比較有意思的是load不遵從繼承規(guī)則,如果某個(gè)類本身沒實(shí)現(xiàn)load方法敬锐,那么不管其各級(jí)父類是否實(shí)現(xiàn)此方法,系統(tǒng)都不會(huì)調(diào)用呆瞻。
load 方法務(wù)必實(shí)現(xiàn)的精簡也就是要盡量減少其所執(zhí)行的操作台夺,整個(gè)應(yīng)用程序在執(zhí)行l(wèi)oad方法時(shí)都會(huì)阻塞。
+ (void) initialize
對于每個(gè)類來說痴脾,該方法會(huì)在程序調(diào)用該類之前調(diào)用颤介,且只調(diào)用一次。它是由運(yùn)行期系統(tǒng)來調(diào)用的赞赖。
- 它是“懶加載”的买窟,也就是說,只有當(dāng)程序用到了相關(guān)類時(shí)薯定,才會(huì)調(diào)用始绍。如果某個(gè)類一直沒有使用,那么其initialize方法一直不會(huì)運(yùn)行话侄。也就是說程序無須把每個(gè)類的initialize方法都執(zhí)行一遍亏推。而load方法不同,程序必須阻塞并等著所有類的load都執(zhí)行完才繼續(xù)年堆。
- initialize方法與其他消息一樣吞杭,如果某個(gè)類未實(shí)現(xiàn)它,而其父類實(shí)現(xiàn)了变丧,那么會(huì)運(yùn)行父類的代碼芽狗。
對比兩個(gè)方法得出結(jié)論:
load方法用起來比較危險(xiǎn),好像寫什么都不好痒蓬,僅僅可能調(diào)試程序用
initialize方法要好點(diǎn)童擎,但是只應(yīng)該用來設(shè)置內(nèi)部數(shù)據(jù)。不應(yīng)該調(diào)用其他方法攻晒,即便是本類自己的方法也別調(diào)用顾复,那些方法稍后有可能添加更多功能
故 實(shí)現(xiàn)了initialize方法 在此方法里面初始化可變數(shù)組,搞定鲁捏!搞定芯砸? 問題來了 我在這個(gè)方法里寫了NSlog ,發(fā)現(xiàn)繼承它的所有類都打印這個(gè)log了给梅,即便子類沒有實(shí)現(xiàn)這個(gè)方法假丧。。
前面提到initialize方法是遵循繼承法則的动羽。所以當(dāng)初始化子類時(shí)包帚,由于并未覆寫此方法,因而還要把父類的實(shí)現(xiàn)代碼再運(yùn)行一遍曹质。鑒于此婴噩,應(yīng)該在initialize方法里加條件判斷:
static NSMutableArray *kSomeArray;
+(void)initialize{
if (self == [SomeBaseClass class]) {
NSLog(@"initialize %@ ", self);
kSomeArray = [NSMutableArray new];
}
}
到這應(yīng)該算是OK了