解析Objective-C?中?`+load`?方法的執(zhí)行順序
理解 Objective-C 中 +load 方法的執(zhí)行順序
在 Objective-C 中,+load
方法是在類或分類被加載到內(nèi)存時(shí)調(diào)用的。它在程序啟動(dòng)過程中非常早的階段執(zhí)行,用于在類或分類被加載時(shí)進(jìn)行一些初始化工作。理解 +load
方法的執(zhí)行順序?qū)τ诰帉懣煽康?Objective-C 代碼非常重要。本文將詳細(xì)探討 +load
方法在類、子類和分類中的執(zhí)行順序。
+load 方法的基本介紹
+load
方法是一個(gè)類方法,在類或分類被加載時(shí)自動(dòng)調(diào)用。與 +initialize
方法不同,+load
方法只會(huì)被調(diào)用一次,并且在加載類和分類時(shí)立即執(zhí)行,而不等待任何實(shí)例的創(chuàng)建。
類和子類中的執(zhí)行順序
當(dāng)一個(gè)類和它的子類都實(shí)現(xiàn)了 +load
方法時(shí),執(zhí)行順序如下:
- 父類的
+load
方法 先于 子類的+load
方法 執(zhí)行。 - 在同一個(gè)繼承層次結(jié)構(gòu)中,類的
+load
方法按照編譯順序執(zhí)行。
例如,考慮以下代碼:
#import <Foundation/Foundation.h> @interface SuperClass : NSObject @end @implementation SuperClass + (void)load { NSLog(@"SuperClass +load"); } @end @interface SubClass : SuperClass @end @implementation SubClass + (void)load { NSLog(@"SubClass +load"); } @end int main(int argc, const char * argv[]) { @autoreleasepool { // 程序啟動(dòng)時(shí)自動(dòng)調(diào)用 `+load` 方法 } return 0; }
輸出結(jié)果將是:
SuperClass +load
SubClass +load
分類中的執(zhí)行順序
分類中的 +load
方法的執(zhí)行順序稍微復(fù)雜一些:
- 分類的
+load
方法 在其所屬類的+load
方法之后執(zhí)行。 - 如果一個(gè)類有多個(gè)分類,那么分類的
+load
方法的執(zhí)行順序是不確定的。這意味著我們不應(yīng)該依賴于分類的加載順序來編寫代碼。
考慮以下示例:
在上述代碼的基礎(chǔ)上,輸出結(jié)果可能是:
SuperClass +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load
或:
SuperClass +load
SubClass +load
SubClass (Category2) +load
SubClass (Category1) +load
父類分類的執(zhí)行順序
如果父類的分類也實(shí)現(xiàn)了 +load
方法,執(zhí)行順序如下:
父類的 +load
方法。
父類分類的 +load
方法(按任意順序)。
子類的 +load
方法。
子類分類的 +load
方法(按任意順序)。
考慮以下示例代碼:
@interface SuperClass (Category) @end @implementation SuperClass (Category) + (void)load { NSLog(@"SuperClass (Category) +load"); } @end
結(jié)合之前的代碼,輸出結(jié)果將是:
SuperClass +load
SuperClass (Category) +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load
到此這篇關(guān)于理解 Objective-C 中 `+load` 方法的執(zhí)行順序的文章就介紹到這了,更多相關(guān)Objective-C +load方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
iOS開發(fā)中Subview的事件響應(yīng)以及獲取subview的方法
這篇文章主要介紹了iOS開發(fā)中Subview的事件響應(yīng)以及獲取subview的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-09-09在IOS中為什么使用多線程及多線程實(shí)現(xiàn)的三種方法
這篇文章給大家介紹在IOS中為什么使用多線程及多線程實(shí)現(xiàn)的三種方法,基本上使用這三種方法實(shí)現(xiàn)多線程(NSThread Grand Centeral Dispatch(GCD) NSOperation和NSOperationQueue),感興趣的朋友可以參考下本篇文章2015-11-11iOS SwiftUI 顏色漸變填充效果的實(shí)現(xiàn)
這篇文章主要介紹了iOS SwiftUI 顏色漸變填充效果的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02IOS NSUserDefault 記住用戶名及密碼功能的實(shí)例代碼
這篇文章主要介紹了IOS NSUserDefault 記住用戶名及密碼功能的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-09-09一個(gè)iOS上的秒表小應(yīng)用的實(shí)現(xiàn)方法分享
這篇文章主要介紹了一個(gè)iOS上的秒表小應(yīng)用的實(shí)現(xiàn)方法分享,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-10-10