OC 的 load 和 initialize

其實有時間還是需要多補充下基礎知識的蔗坯,畢竟步子跨太大會扯到襠。

- load

Invoked whenever a class or category is added to the Objective-C runtime; implement this method to perform class-specific behavior upon loading.

這是 Apple Doc 上對 - load 的描述前鹅。(強行秀一波翻譯罐柳,其實我是個英語渣,最好還是看英文吧)當一個類或分類被添加到運行時的時候會觸發(fā)這個方法澈魄;實現(xiàn)這個方法可以在加載這個類時執(zhí)行一些特定的操作采章。

寫下 demo 看看這個方法在繼承樹上是什么執(zhí)行順序运嗜,雖然文檔里有寫。

  • A class’s +load method is called after all of its superclasses’ +load methods.
  • A category +load method is called after the class’s own +load method.

先執(zhí)行所有的父類的 - load 方法悯舟,分類的 - load 方法將會是最后執(zhí)行担租。

// Parent.m
+ (void)load {
    NSLog(@"Parent load");
}

// Child.m
+ (void)load {
    NSLog(@"Child load");
}

// Child+Category.m
+ (void)load {
    NSLog(@"Child Category load");
}

load

有興趣的朋友可以自己去試試。

- initialize

Initializes the class before it receives its first message.

在收到第一條消息之前初始化類抵怎,也就是說你 #import 了這個類奋救,但是沒有用到這個類,就不會初始化它(有點懶加載的味道)反惕。

The runtime sends the initialize message to classes in a thread-safe manner. Superclasses receive this message before their subclasses. The superclass implementation may be called multiple times if subclasses do not implement initialize—the runtime will call the inherited implementation—or if subclasses explicitly call [super initialize].

runtime 會線程安全地發(fā)送 initialize 消息給類尝艘。父類會比它的子類先收到這個消息。如果子類沒有實現(xiàn) initialize 這個方法姿染,那么父類的 initialize 方法會被執(zhí)行多次 —— 否則 runtime 將會調(diào)用子類實現(xiàn) —— 除非子類明確調(diào)用 [super initialize] 背亥。

demo time。動手 ba 一 ba 。

// Parent.m
+ (void)initialize {
    NSLog(@"Parent initialize");
}

// Child.m
+ (void)initialize {
    NSLog(@"Child initialize");
}

// Child+Category.m
+ (void)initialize {
    NSLog(@"Child Category initialize");
}

// main.m
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        [Child new];
        [Child new];
    }
    return 0;
}
initialize

結(jié)果中可以看出分類中的 initialize 會覆蓋掉類中 initialize 方法狡汉,而父類的 initialize 方法仍舊會被執(zhí)行娄徊。
接下來我們把子類中的 initialize 方法注釋掉,重新跑一遍看看結(jié)果盾戴。

initialize

發(fā)現(xiàn)父類的 initialize 方法被調(diào)用了兩遍寄锐,然后我們看文檔中的這段話。

The runtime sends initialize to each class in a program just before the class, or any class that inherits from it, is sent its first message from within the program.

這段話的大致意思就是說 runtime 會發(fā)送 initialize 給這個類以及這個類的所有父類尖啡,因此當我們使用 Child 的時候橄仆,runtime 會先發(fā)送 initialize 消息給 Parent ,然后發(fā)送給 Child 可婶,但是 Child 沒有實現(xiàn) initialize 方法沿癞,所以就再次執(zhí)行了 Parent 的 initialize 。
所以如果使用一個 Grandson (沒有實現(xiàn) initialize)矛渴,則 Parent 的 initialize 將會被調(diào)用三次。

有時候我們可能需要這樣的效果惫搏,但是大多數(shù)時間我們是不需要這樣的具温,因此我們可以在實現(xiàn) initialize 時,這樣寫來避免這個問題筐赔。

+ (void)initialize {
    if (self == [ClassName self]) {
         // ... do the initialization ...
    }
}

用處(歡迎補充)

  • load
    在 load 中實現(xiàn)Method Swizzling:
+ (void)load {
    Method a = class_getInstanceMethod([self class], @selector(logA));
    Method b = class_getInstanceMethod([self class], @selector(logB));
    method_exchangeImplementations(a, b);
}
- (void)logA {
    NSLog(@"A");
}

- (void)logB {
    NSLog(@"B");
}
  • initialize
    初始化一些靜態(tài)對象
// static NSArray *array = @[@1, @2]; //這樣是不行滴铣猩,編譯器不接受,只有數(shù)據(jù)類型才能這樣哦
static NSArray *array;
+ (void)initialize { 
    if (self == [Parent class]) { 
        array = @[@1, @2];
    } 
}

小結(jié)

| | load | initialize |
| :--- : | :-----: | :----: |
| 調(diào)用時機 | 類被添加到 runtime 時 | 類第一次接收到消息之前 |
| 調(diào)用順序 | 父類->子類->分類 | 父類 -> 子類(分類) |
| 調(diào)用次數(shù) | 1次 | 多次 |
| 顯式調(diào)用父類 | 否 | 否 |
| 分類中的實現(xiàn) | 類和分類都執(zhí)行 | 覆蓋類的實現(xiàn)茴丰,執(zhí)行分類的實現(xiàn) |
| 線程安全 | 安全 | 安全 |

上表主要就是這兩個方法的特點达皿,因為是線程安全的,所以在這兩個方法盡量少執(zhí)行復雜的操作贿肩,防止阻塞線程峦椰。

以上就是我對這兩個方法的描述,如有不對望指正汰规,給個喜歡以示支持汤功。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市溜哮,隨后出現(xiàn)的幾起案子滔金,更是在濱河造成了極大的恐慌,老刑警劉巖茂嗓,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件餐茵,死亡現(xiàn)場離奇詭異,居然都是意外死亡述吸,警方通過查閱死者的電腦和手機忿族,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人肠阱,你說我怎么就攤上這事票唆。” “怎么了屹徘?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵走趋,是天一觀的道長。 經(jīng)常有香客問我噪伊,道長簿煌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任鉴吹,我火速辦了婚禮姨伟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘豆励。我一直安慰自己夺荒,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布良蒸。 她就那樣靜靜地躺著技扼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫩痰。 梳的紋絲不亂的頭發(fā)上剿吻,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音串纺,去河邊找鬼丽旅。 笑死,一個胖子當著我的面吹牛纺棺,可吹牛的內(nèi)容都是我干的榄笙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼五辽,長吁一口氣:“原來是場噩夢啊……” “哼办斑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起杆逗,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤乡翅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后罪郊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠕蚜,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年悔橄,在試婚紗的時候發(fā)現(xiàn)自己被綠了靶累。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腺毫。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挣柬,靈堂內(nèi)的尸體忽然破棺而出潮酒,到底是詐尸還是另有隱情,我是刑警寧澤邪蛔,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布急黎,位于F島的核電站,受9級特大地震影響侧到,放射性物質(zhì)發(fā)生泄漏勃教。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一匠抗、第九天 我趴在偏房一處隱蔽的房頂上張望故源。 院中可真熱鬧,春花似錦汞贸、人聲如沸绳军。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽删铃。三九已至,卻和暖如春踏堡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背咒劲。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工顷蟆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腐魂。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓帐偎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛔屹。 傳聞我的和親對象是個殘疾皇子削樊,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

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