1. 程式人生 > >Load和Initialize往死了問是一種怎樣的體驗

Load和Initialize往死了問是一種怎樣的體驗

一. Load和Initialize的往死了問是一種怎樣的體驗?

Load 和 Initialize 先載入哪個?

父類和子類以及 Category 的關係?

如果是多個 Category 呢?

Load

開發文件的直接解讀

載入順序總結

  • 所有類和分類的 +load 方法都是在被加入到 runtime 的時候呼叫

  • 父類優先於子類載入(內部通過遞迴的的方式實現)

  • 在所有本類載入完畢之後再去載入各個分類

  • 同一個類的多個分類載入順序可檢視 Target -> Build Phases -> Compile Sources

比如,現有Student 繼承於 Person,Student擁有多個分類,在各個類的 + load 方法進行列印,結果如下

1 2 3 4 5 6 7 2017-06-26 18:30:59.857400+0800 load[70593:5621604] Person ==> Load 2017-06-26 18:30:59.857596+0800 load[70593:5621604] Student ==> Load 2017-06-26 18:30:59.857656+0800 load[70593:5621604] Test2 ==> Load
2017-06-26 18:30:59.857707+0800 load[70593:5621604] Test1 ==> Load 2017-06-26 18:30:59.857724+0800 load[70593:5621604] Student + load2 ==> Load 2017-06-26 18:30:59.857730+0800 load[70593:5621604] Student + load3 ==> Load 2017-06-26 18:30:59.857736+0800 load[70593:5621604] Student + load1 ==> Load

檢視 Compile Sources,觀察 Student 三個分類的載入順序,與 load 呼叫順序一致

runtime 原始碼閱讀

首先看下 objc-runtime-new.mm 中的 void prepare_load_methods(header_info *hi) 函式,在該函式中準備好 類和分類執行 +load 方法的必要條件,以供接下來的呼叫

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 void prepare_load_methods(header_info *hi) { size_t count, i; rwlock_assert_writing(&runtimeLock); classref_t *classlist = _getObjc2NonlazyClassList(hi, &count); for (i = 0; i < count; i++) { schedule_class_load(remapClass(classlist[i])); } category_t **categorylist = _getObjc2NonlazyCategoryList(hi, &count); for (i = 0; i < count; i++) { category_t *cat = categorylist[i]; Class cls = remapClass(cat->cls); if (!cls) continue;  // category for ignored weak-linked class realizeClass(cls); assert(cls->ISA()->isRealized()); add_category_to_loadable_list(cat); } }

同時,在處理類的時候,也呼叫了同文件中的另外一個函式 static void schedule_class_load(Class cls)

相關推薦

LoadInitialize怎樣的體驗

一. Load和Initialize的往死了問是一種怎樣的體驗? Load 和 Initialize 先載入哪個? 父類和子類以及 Category 的關係? 如果是多個 Category 呢? Load 開發文件的直接解讀

Objective-C類方法 load initialize

object mage cnblogs 什麽 類方法 color ech 引用 https 1、區別:+load 是只要類所在文件被引用就會被調用,而 +initialize 是在類或者其子類的第一個方法被調用前調用。所以如果類沒有被引用進項目,就不會有 +load 調用;

數據庫查詢速度慢?是否是因為解決鎖的方法。

-- 檢索 blog kill _id exe 進行 xxx 通過 --查詢哪些表被死鎖 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sy

load initialize

@implementation NSObject (loadAndInitial) + (void)initializeAndLog {     NSLog(@"**out- %s %@",__func__,[self class]);    

利用 window 物件的 load beforeunload 事件實現網頁崩潰的監控。

不錯的文章,推薦閱讀:Logging Information on Browser Crashes。 window.addEventListener('load', function () { sessionStorage.setItem('good_exit', 'pending')

解讀OC中的loadinitialize

在 Objective-C 中,NSObject 是絕大多數類的基類。而在 NSObject 中有兩個類方法 load 和 initialize,那這兩個方法是在什麼時機被呼叫呢?父類、Category 的呼叫順序又是怎樣的呢?本文解讀一下這兩個方法的區別於聯絡及使用場景。 Load load方法在這個檔

Objective C類方法loadinitialize的區別

1 +(void)load會引發+(void)initialize 2 /******* Interface *******/ 3 @interface SuperClass : NSObject 4 @end 5 6 @interface ChildClass : SuperClass 7

Objc類的載入初始化(+load+initialize方法)

作為一個程式設計師,絕大多數時候你都不需要關心一個類是怎麼被載入進記憶體的。這裡面 runtime linker 在你的程式碼還沒跑起來之前就已經做了很多複雜的工作。 對於大多類來說,知道這一點就已經相當足夠了。但是,有一些類可能需要做一些特殊的準備工作。比如初始化一個全域性的表,從 UserDefau

初探+load+initialize方法

+ (void)initialize 訊息是在該類接收到其第一個訊息之前呼叫。關於這裡的第一個訊息需要特別說明一下,對於 NSObject 的 runtime 機制而言,其在呼叫 NSObject 的 + (void)load 訊息不被視為第一個訊息,但是,如果像普通函式呼叫一樣直接呼叫 NSObject 

關於loadinitialize,《深入剖析loadinitialize方法》

在Objective-C中,NSObject是根類,而NSObject.h的標頭檔案中前兩個方法就是load和initialize兩個類方法,本篇文章就對這兩個方法進行詳細、深入的剖析。 就像Application有生命週期回撥方法一樣,在Objective-

寫高質量OC程式碼52建議總結:51.loadinitialize

有時候,類必須先執行某些初始化操作才能正常執行,先說下load方法:  +(void)load  加入執行期系統中的每個類及分類必定會呼叫此方法,只調用一次(在程式啟動的時候)。如果類和所屬的分類都定義了load方法,先呼叫類中的,再呼叫分類中的。 load方法的問題在於,

+load+initialize方法呼叫時機

一、+load方法什麼時候呼叫 +load方法會在runtime載入類、分類時呼叫(程式執行起來會先去載入呼叫+load 跟你引用沒有引用其標頭檔案沒有關係)。每個類、分類的+load,在程式執行過程中只調用一次。 呼叫順序: 先呼叫類的+load 按照編譯先後順序呼叫(先編譯,先呼叫) 呼叫子類的+l

在Ubuntu安裝使用Anbox完整說明(在Linux使用Android應用的方法)

在Ubuntu安裝和使用Anbox完整說明(一種在Linux使用Android應用的方法) Anbox是一種基於容器的方法,用於在常規GNU/Linux系統 https://anbox.io上啟動完整的Android系統,相似但不同的專案還有Shashlik和Genimob

插入排序----希爾排序-----(本文給出直接插入排序)

希爾排序原理如下(純手打): 假設有下面一個數組 99, 38, 65, 82, 26, 13, 27, 49, 55, 1 第一趟排序 首先設定一個增量inc,比如說最開始的增量為陣列長度的一半即 arr.length/2 = 5,則上面的陣列可以分成如下幾組(相同顏色的為

使用程式設計師的電腦是怎樣的體驗?網友:沒圖示的桌面不會用

程式設計師作為一個全天候接觸電腦的職業,我想應該沒有誰能夠比他們更加了解電腦的使用了。那麼程式設計師使用的電腦跟我們用的有什麼區別嗎?有很多網友也同樣好奇,於是試著去體驗一下,結果鬧出了許多逗逼事! 程式設計師甲: 我用的linux,wm用了awesome(就

Gulpwebpack的區別,是工具嗎

                背景: 最近收到很多童鞋的問題:gulp和webpack 什麼關係,是一種東西嗎?可以只用gulp,不用webpack嗎 或者反過來?基於此問: 我簡單歸結了一下區別和概念,讓需要的同學閱讀理解,從而不把時間浪費到這種模糊不清的選擇問題上!-------------------

憤怒悲哀一樣,也是軟弱

       人是一個情緒化的動物,遇到不順的事情很容易發火,因為發火會讓鬱悶的心情得到宣洩。然而生活中大多時候憤怒並不能解決問題,反而使問題的矛盾升級和惡化。生活中難免會遇到各種各樣讓自己不爽的事,尤其當我們處於絕對優勢的位置時,很容易強勢地去用憤怒表達

CENTOS: Docker網路突然斷情況

今天,加了一個新IP地址的時候,Docker是網路突然斷了。但是系統重新啟動,一切就恢復正常。 後來發現,這個是和網路重新啟動有關,只要是執行systemctl restart networkDocker的網路就斷了。這個時候,主要把Docker也重啟就沒有問題了。 sys

zookeeper啟動不解決方式

zkServer.sh start 後顯示started了 但是,狀態卻顯示not running 有時候是顯示問題,但是本次叢集確實沒有啟動. 檢視{$ZOOKPPER_HOME}/conf/zoo.cfg 中配置的dataDir目錄位置,刪除其中除了myi

快速備份還原 MySQL 資料庫的另方法

一直使用 SQL Server 作為公司產品的資料庫來儲存系統資料,所以備份還原一直都不是問題,因為 SQL Server 的備份還原非常迅速和易用。但今年公司改變策略,使用起 MySQL 資料庫作為新產品的資料庫後,我們終於遇到了備份還原的大難題:我們需要把客戶的