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)
相關推薦Load和Initialize往死了問是一種怎樣的體驗一. Load和Initialize的往死了問是一種怎樣的體驗? Load 和 Initialize 先載入哪個? 父類和子類以及 Category 的關係? 如果是多個 Category 呢? Load 開發文件的直接解讀 Objective-C類方法 load 和 initializeobject 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中的load和initialize在 Objective-C 中,NSObject 是絕大多數類的基類。而在 NSObject 中有兩個類方法 load 和 initialize,那這兩個方法是在什麼時機被呼叫呢?父類、Category 的呼叫順序又是怎樣的呢?本文解讀一下這兩個方法的區別於聯絡及使用場景。 Load load方法在這個檔 Objective C類方法load和initialize的區別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 關於load和initialize,《深入剖析load和initialize方法》在Objective-C中,NSObject是根類,而NSObject.h的標頭檔案中前兩個方法就是load和initialize兩個類方法,本篇文章就對這兩個方法進行詳細、深入的剖析。 就像Application有生命週期回撥方法一樣,在Objective- 寫高質量OC程式碼52建議總結:51.load和initialize有時候,類必須先執行某些初始化操作才能正常執行,先說下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(就 Gulp和webpack的區別,是一種工具嗎背景: 最近收到很多童鞋的問題: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 資料庫作為新產品的資料庫後,我們終於遇到了備份還原的大難題:我們需要把客戶的 |