iOS Category實現原理 補充

2022-03-26 06:49:56 字數 1296 閱讀 7958

load

load方法會在程式啟動就會呼叫,當裝載類資訊的時候就會呼叫。

void call_load_methods(void)

// 2. call category +loads once

// 2.呼叫分類的 load 方法

more_categories = call_category_loads();

// 3. run more +loads if there are classes or more untried categories

} while (loadable_classes_used > 0 || more_categories);

objc_autoreleasepoolpop(pool);

loading = no;

}

通過原始碼我們發現是優先呼叫類的load方法,之後呼叫分類的load方法。

檢視load方法的呼叫原始碼,在 objc-loadmethod.m 檔案中

static void call_class_loads(void)

(*load_method)(cls, sel_load);

}// destroy the detached list.

if (classes) free(classes);

}

我們看到load方法中直接拿到load方法的記憶體位址直接呼叫方法,不在是通過訊息傳送機制呼叫。

所以原始類的load方法並不會被覆蓋,且呼叫類的load方法之前會保證其父類已經呼叫過load方法。

initialize

當類第一次接收到訊息時,就會呼叫initialize,相當於第一次使用類的時候就會呼叫initialize方法。呼叫子類的initialize之前,會先保證呼叫父類的initialize方法。如果之前已經呼叫過initialize,就不會再呼叫initialize方法了。當分類重寫initialize方法時會先呼叫分類的方法。

void callinitialize(class cls)

由此我們發現,initialize是通過訊息傳送機制呼叫的,訊息傳送機制通過isa指標找到對應的方法與實現,因此先找到分類方法中的實現,會優先呼叫分類方法中的實現。

總結category中有load方法嗎?load方法是什麼時候呼叫的?load 方法能繼承嗎?

load、initialize的區別,以及它們在category重寫的時候的呼叫的次序。

呼叫時刻:

呼叫順序:

IOSCategory類別和Extension擴充套件

category和extension 一 概述 類別是一種為現有的類新增新方法的方式。利用objective c的動態執行時分配機制,category提供了一種比繼承 inheritance 更為簡潔的方法來對class進行擴充套件,無需建立物件類的子類就能為現有的類新增新方法,可以為任何已經存在的...

黑馬程式設計師 ios category 簡介

分類的作用 在不改變原來類內容的基礎上,為類增加一些方法 使用注意 1.分類只能增加方法,不能增加成員變數 2.分類方法實現中可以訪問原來類中宣告的變數 3.分來的優先順序高,優先去分類中找方法,然後再去原來類中找,最後去父類中找 4.分類可以重新實現原來類中的方法,但是會覆蓋掉原來的方法,會導致原...

kvo實現原理 KVC KVO實現原理

一 kvc運用了乙個isa swizzling技術。isa swizzling就是型別混合指標機制。kvc主要通過isa swizzling,來實現其內部查詢定位的。isa指標,如其名稱所指,就是is a kind of的意思 指向維護分發表的物件的類。該分發表實際上包含了指向實現類中的方法的指標,...