??Effective OC - Tip 51: 精簡 initialize 和 load 的實現代碼

  1. 由于 Load 和 Object 都屬于類加載的機制,都屬于 NSObject 里面的函數, 所以離開NSObject 離開運行時也就無所謂這兩個函數了。
  2. Load 發生在應用冷啟動加載的時候,不參與系統的override機制,先加載類的Load , 再加載 category 的 Load , 無關繼承鏈。
  3. initialize 發生在第一次調用該類的時候,但是它關聯繼承鏈, 所以如果子類和父類都實現了 initialize 方法,會先調用父類的initialize ,然后調用子類的。
@implementation LoadingObject
//無法再編譯器確定的全局變量,可以設置到initialize里面初始化
static NSMutableArray* array;
+ (void)initialize {
    if (self == [LoadingObject class]) {
        NSLog(@"initialize LoadingObject");
        array = @[].mutableCopy;
    }
}
+ (void)load {
    //error1: 為什么先打印了initialize, 因為調用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 發生在 main() 函數之前之前,點擊圖標系統 exec() 之后。
  2. 由于執行 main() 之前還是一個單線程操作,所以不建議在 load 里面執行過多操作,要優化啟動,確實需要放到 initialize 里面。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容