Objective-C load與initialize

Objective-C? load與initialize

一、 + (void) load

當(dāng)包含類或分類的程序庫(kù)載入系統(tǒng)時(shí),就會(huì)執(zhí)行此方法,而這通常是指應(yīng)用程序啟動(dòng)的時(shí)候,若程序視為iOS平臺(tái)設(shè)計(jì)的,則肯定是在此時(shí)執(zhí)行。

Mac OS X 應(yīng)用程序自由一些,他們可以使用動(dòng)態(tài)加載(dynamic loading)之類的特性,等應(yīng)用程序啟動(dòng)好之后再去加載程序庫(kù)

執(zhí)行 load 方法時(shí),運(yùn)行期系統(tǒng)處于“脆弱狀態(tài)”,不能安全的使用任意類中的方法

不遵從普通方法的繼承規(guī)則:如果某類并未實(shí)現(xiàn) load 方法,無論超類是否實(shí)現(xiàn),都不會(huì)調(diào)用

load 應(yīng)盡量精簡(jiǎn):因?yàn)閼?yīng)用程序在執(zhí)行 load 方法時(shí)會(huì)被阻塞

load 方法里不能調(diào)用其他類(其他類可能未載入),不能調(diào)用等待鎖以及可能加鎖的方法(可能阻塞程序)

子類的 load 方法不需要調(diào)用父類的該方法


執(zhí)行順序

1. 當(dāng)父類和子類都實(shí)現(xiàn) load 函數(shù)時(shí),父類的 load 方法執(zhí)行順序要優(yōu)先于子類

?2.?當(dāng)子類未實(shí)現(xiàn) load 方法時(shí),不會(huì)調(diào)用父類 load 方法

?3. 類中的 load 方法執(zhí)行順序要優(yōu)先于類別(Category)

?4. 當(dāng)有多個(gè)類別(Category)都實(shí)現(xiàn)了 load 方法,這幾個(gè) load 方法都會(huì)執(zhí)行,但執(zhí)行順序不確定(其執(zhí)行順序與類別在 Compile Sources 中出現(xiàn)的順序一致)

?5. 當(dāng)然當(dāng)有多個(gè)不同的類的時(shí)候,每個(gè)類 load 執(zhí)行順序與其在 Compile Sources 出現(xiàn)的順序一致

### 二、 + (void) initialize

該方法會(huì)在程序首次用該類之前調(diào)用,它是由運(yùn)行期系統(tǒng)調(diào)用的,絕不應(yīng)該通過代碼直接調(diào)用

特性

惰性調(diào)用(用到時(shí)某個(gè)類時(shí)才會(huì)調(diào)用)

執(zhí)行 initialize 方法時(shí),運(yùn)行期系統(tǒng)處于“正常狀態(tài)”,可以安全使用任意類中的方法

線程安全

和普通方法一樣,子類未實(shí)現(xiàn),超類實(shí)現(xiàn)了,會(huì)調(diào)用超類的

如果全局變量無法再編譯期初始化(比如Objective - C對(duì)象),可放在 initialize 里

#import"A.h"

// 報(bào)錯(cuò)

// static NSMutableArray *kTestArray=[[NSMutableArray alloc] init];

static NSMutableArray *kTestArray;

@implementationA

+ (void)initialize{

????????//此方法通常這樣使用

????????//只有開發(fā)者期望的那個(gè)類載入系統(tǒng)時(shí),才執(zhí)行相關(guān)操作,這個(gè)視情況而定

????????if(self==[A class]) {

????????????????kTestArray=[[NSMutableArrayalloc] init];

????????}

}

@end

initialize 坑

如果初次用到的線程正好為UI線程,程序?qū)?huì)阻塞

無法控制初始化時(shí)機(jī)。如果程序以來某個(gè)時(shí)間點(diǎn),但是運(yùn)行期系統(tǒng)更新,初始化時(shí)間點(diǎn)如果改變,問題就出現(xiàn)了

可能產(chǎn)生“依賴環(huán)”, 如果 A 類的 initialize 方法用到B類,B類還沒初始化,系統(tǒng)會(huì)強(qiáng)行初始化,此時(shí)A類還沒初始化完成。如果B類實(shí)現(xiàn)initialize方法時(shí)用到A類的數(shù)據(jù),此時(shí)A類的數(shù)據(jù)尚未完成,“依賴環(huán)”由此產(chǎn)生


執(zhí)行順序

?1. 父類的 initialize 方法會(huì)比子類先執(zhí)行

?2. 當(dāng)子類不實(shí)現(xiàn) initialize 方法,會(huì)把父類的實(shí)現(xiàn)繼承過來調(diào)用一遍。在此之前,父類的方法會(huì)被優(yōu)先調(diào)用一次

?3.?當(dāng)有多個(gè) Category 都實(shí)現(xiàn)了 initialize 方法,會(huì)覆蓋類中的方法,只執(zhí)行一個(gè)(會(huì)執(zhí)行Compile Sources 列表中最后一個(gè)Category 的 initialize 方法)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容