??Effective OC - Tip 51: 精簡 initialize 和 load 的實現(xiàn)代碼

  1. 由于 Load 和 Object 都屬于類加載的機(jī)制,都屬于 NSObject 里面的函數(shù), 所以離開NSObject 離開運(yùn)行時也就無所謂這兩個函數(shù)了。
  2. Load 發(fā)生在應(yīng)用冷啟動加載的時候,不參與系統(tǒng)的override機(jī)制,先加載類的Load , 再加載 category 的 Load , 無關(guān)繼承鏈。
  3. initialize 發(fā)生在第一次調(diào)用該類的時候,但是它關(guān)聯(lián)繼承鏈, 所以如果子類和父類都實現(xiàn)了 initialize 方法,會先調(diào)用父類的initialize ,然后調(diào)用子類的。
@implementation LoadingObject
//無法再編譯器確定的全局變量,可以設(shè)置到initialize里面初始化
static NSMutableArray* array;
+ (void)initialize {
    if (self == [LoadingObject class]) {
        NSLog(@"initialize LoadingObject");
        array = @[].mutableCopy;
    }
}
+ (void)load {
    //error1: 為什么先打印了initialize, 因為調(diào)用self description 的方法
    NSLog(@"load LoadingObject");
}
@end

@interface LoadingChildObject : LoadingObject
@end

@implementation LoadingChildObject
+ (void)initialize {
    NSLog(@"initialize LoadingChildObject");
}

+ (void)load {
    NSLog(@"load LoadingChildObject");
}
@end

Extension:

  1. Load 發(fā)生在 main() 函數(shù)之前之前,點擊圖標(biāo)系統(tǒng) exec() 之后。
  2. 由于執(zhí)行 main() 之前還是一個單線程操作,所以不建議在 load 里面執(zhí)行過多操作,要優(yōu)化啟動,確實需要放到 initialize 里面。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容