load方法和initialize方法異同

load方法和initialize方法異同

  • load方法會(huì)在加載類(lèi)的時(shí)候就被調(diào)用限书,也就是說(shuō)iOS應(yīng)用啟動(dòng)的時(shí)候习蓬,就會(huì)加載所有的類(lèi)绘迁,會(huì)調(diào)用每個(gè)類(lèi)的+load方法纪岁。

+load方法舉例

-新建父類(lèi)Person類(lèi) 并在.m里面實(shí)現(xiàn)+load方法

#import <Foundation/Foundation.h>
@interface Person : NSObject
@end
#import "Person.h"

@implementation Person
+(void)load
{
    NSLog(@"%s",__func__);
}
@end

繼承Person類(lèi)新建子類(lèi)Son類(lèi) 并在.m里面實(shí)現(xiàn)+load方法

#import "Person.h"
@interface Son : Person
@end
#import "Son.h"

@implementation Son
+(void)load
{
    NSLog(@"%s",__func__);
}
@end

給父類(lèi)Person類(lèi)創(chuàng)建Category 并且在.m里面實(shí)現(xiàn)+load方法

#import "Person.h"

@interface Person (Category)
@end
#import "Person+Category.h"

#import <AppKit/AppKit.h>


@implementation Person (Category)
+(void)load
{
    NSLog(@"%s",__func__);
}
@end

運(yùn)行打印

2019-10-23 11:41:35.366135+0800 load+initialize[1673:96489] +[Person load]
2019-10-23 11:41:35.366666+0800 load+initialize[1673:96489] +[Son load]
2019-10-23 11:41:35.366721+0800 load+initialize[1673:96489] +[Person(Category) load]
2019-10-23 11:41:35.366845+0800 load+initialize[1673:96489] main, Hello World!
Program ended with exit code: 0
  • 實(shí)操證明+load方法在對(duì)類(lèi)沒(méi)有進(jìn)行任何操作的情況下默認(rèn)調(diào)用而且在main函數(shù)之前調(diào)用。
  • 調(diào)用順序:父類(lèi)---> 子類(lèi)---> 分類(lèi)
  • 平級(jí)調(diào)用順序 (例如又創(chuàng)建了person2類(lèi) )這個(gè)時(shí)候的調(diào)用順序?yàn)轫?xiàng)目-->TARGETS —>Build Phases -->Compile Sources -加載的順序

+initialize方法舉例

在上述Person類(lèi).m中實(shí)現(xiàn)+(void)initialize方法

#import "Person.h"

@implementation Person
+(void)load
{
    NSLog(@"%s",__func__);
}


+(void)initialize
{
    NSLog(@"%s",__func__);
}

- (instancetype)init
{
    self = [super init];
      if (self) {
             NSLog(@"%s",__func__);
      }
      return self;
}

@end
  • 運(yùn)行發(fā)現(xiàn)沒(méi)有initialize方法調(diào)用

在main函數(shù)中初始化

#import <Foundation/Foundation.h>
#import "Person.h"
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"%s, Hello World!",__func__);
        
       Person * person = [[Person alloc]init];
 
        
        
    }
    return 0;
}

------------------------load-----------------------------------------
2019-10-23 12:57:52.431490+0800 load+initialize[2080:126579] +[Person load]
2019-10-23 12:57:52.432133+0800 load+initialize[2080:126579] +[Son load]
2019-10-23 12:57:52.432369+0800 load+initialize[2080:126579] +[Person(Category) load]
2019-10-23 12:57:52.432614+0800 load+initialize[2080:126579] main, Hello World!
------------------------initialize----------------------------------------
2019-10-23 12:57:52.432687+0800 load+initialize[2080:126579] +[Person initialize]
2019-10-23 12:57:52.432841+0800 load+initialize[2080:126579] -[Person init]
Program ended with exit code: 0

  • 運(yùn)行發(fā)現(xiàn)initialize方法在init方法前調(diào)用

這時(shí)在Person+Category.m中實(shí)現(xiàn)initialize方法 并且運(yùn)行

#import "Person+Category.h"

#import <AppKit/AppKit.h>


@implementation Person (Category)
+(void)load
{
    NSLog(@"%s",__func__);
}


+(void)initialize
{
    NSLog(@"%s",__func__);
}
@end
------------------------load-----------------------------------------
2019-10-23 13:02:33.317059+0800 load+initialize[2128:128769] +[Person load]
2019-10-23 13:02:33.318109+0800 load+initialize[2128:128769] +[Son load]
2019-10-23 13:02:33.318562+0800 load+initialize[2128:128769] +[Person(Category) load]
2019-10-23 13:02:33.318907+0800 load+initialize[2128:128769] main, Hello World!
------------------------initialize----------------------------------------
2019-10-23 13:02:33.319210+0800 load+initialize[2128:128769] +[Person(Category) initialize]
2019-10-23 13:02:33.319515+0800 load+initialize[2128:128769] -[Person init]
Program ended with exit code: 0

  • 運(yùn)行發(fā)現(xiàn)Person的方法被Person+Category里的initialize方法替換

這時(shí)在Son類(lèi)中實(shí)現(xiàn)+initialize方法 并且在main函數(shù)中初始化并運(yùn)行

#import "Son.h"

@implementation Son
+(void)load
{
    NSLog(@"%s",__func__);
}



+(void)initialize
{
    NSLog(@"%s",__func__);
}
- (instancetype)init
{
    self = [super init];
    if (self) {
         NSLog(@"%s",__func__);
    }
    return self;
}

@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Son.h"
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"%s, Hello World!",__func__);
       
            Person * person = [[Person alloc]init];
            
            Son * son = [[Son alloc]init];
        
        
    }
    return 0;
}

------------------------load-----------------------------------------
2019-10-23 13:16:06.456182+0800 load+initialize[2362:141389] +[Person load]
2019-10-23 13:16:06.456668+0800 load+initialize[2362:141389] +[Son load]
2019-10-23 13:16:06.456877+0800 load+initialize[2362:141389] +[Person(Category) load]
2019-10-23 13:16:06.457197+0800 load+initialize[2362:141389] main, Hello World!
------------------------initialize----------------------------------------
2019-10-23 13:16:06.457270+0800 load+initialize[2362:141389] +[Person(Category) initialize]
2019-10-23 13:16:06.457411+0800 load+initialize[2362:141389] -[Person init]
2019-10-23 13:16:06.457516+0800 load+initialize[2362:141389] +[Son initialize]
2019-10-23 13:16:06.457632+0800 load+initialize[2362:141389] -[Person init]
2019-10-23 13:16:06.457724+0800 load+initialize[2362:141389] -[Son init]
Program ended with exit code: 0
  • 運(yùn)行發(fā)現(xiàn)Person的方法被Person+Category里的initialize方法替換 無(wú)論初始化多少次 Person+Category.m里的方法只會(huì)調(diào)用一次(猜測(cè)如果沒(méi)有分類(lèi)那么父類(lèi)的initialize也只會(huì)調(diào)用一次下面論證)

這時(shí)將main函數(shù)里的父類(lèi)初始化去掉運(yùn)行

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Son.h"
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"%s, Hello World!",__func__);
       
            ///////Person * person = [[Person alloc]init];
            Son * son = [[Son alloc]init];
        
        
    }
    return 0;
}

------------------------load-----------------------------------------
2019-10-23 13:22:37.053879+0800 load+initialize[2414:144467] +[Person load]
2019-10-23 13:22:37.054447+0800 load+initialize[2414:144467] +[Son load]
2019-10-23 13:22:37.054611+0800 load+initialize[2414:144467] +[Person(Category) load]
2019-10-23 13:22:37.054742+0800 load+initialize[2414:144467] main, Hello World!
------------------------initialize----------------------------------------
2019-10-23 13:22:37.054797+0800 load+initialize[2414:144467] +[Person(Category) initialize]
2019-10-23 13:22:37.054842+0800 load+initialize[2414:144467] +[Son initialize]
2019-10-23 13:22:37.054889+0800 load+initialize[2414:144467] -[Person init]
2019-10-23 13:22:37.054929+0800 load+initialize[2414:144467] -[Son init]
Program ended with exit code: 0
  • 運(yùn)行發(fā)現(xiàn)初始化子類(lèi) 父類(lèi)的分類(lèi)里的initialize會(huì)被調(diào)用(猜測(cè)如果沒(méi)有分類(lèi)那么會(huì)先調(diào)用父類(lèi)的initialize )在調(diào)用子類(lèi)的initialize

好的乘勝追擊 這時(shí)將分類(lèi)里的initialize方法去掉 再次運(yùn)行

#import "Person+Category.h"

#import <AppKit/AppKit.h>


@implementation Person (Category)
+(void)load
{
    NSLog(@"%s",__func__);
}

//
//+(void)initialize
//{
//    NSLog(@"%s",__func__);
//}
@end

------------------------load----------------------------------------
2019-10-23 13:28:14.368976+0800 load+initialize[2484:146913] +[Person load]
2019-10-23 13:28:14.369644+0800 load+initialize[2484:146913] +[Son load]
2019-10-23 13:28:14.369725+0800 load+initialize[2484:146913] +[Person(Category) load]
2019-10-23 13:28:14.369850+0800 load+initialize[2484:146913] main, Hello World!

------------------------initialize----------------------------------------
2019-10-23 13:28:14.369904+0800 load+initialize[2484:146913] +[Person initialize]
2019-10-23 13:28:14.369946+0800 load+initialize[2484:146913] +[Son initialize]
2019-10-23 13:28:14.369993+0800 load+initialize[2484:146913] -[Person init]
2019-10-23 13:28:14.370032+0800 load+initialize[2484:146913] -[Son init]
  • 發(fā)現(xiàn)只初始化子類(lèi)父類(lèi)的initialize會(huì)調(diào)用 父類(lèi)有分類(lèi)并實(shí)現(xiàn)initialize方法會(huì)會(huì)把 父類(lèi)里分方法替換掉 父類(lèi)不會(huì)在調(diào)用 (分類(lèi)里實(shí)現(xiàn)initialize方法會(huì)把類(lèi)里面的initialize方法替換掉)

這時(shí)候打開(kāi)main函數(shù)的父類(lèi)初始化 子類(lèi)與父類(lèi)進(jìn)行多次初始化 并運(yùn)行

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Son.h"
 
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        NSLog(@"%s, Hello World!",__func__);
       
         Person * person = [[Person alloc]init];
            Person * person1 = [[Person alloc]init];
            Person * person2 = [[Person alloc]init];
            Person * person3 = [[Person alloc]init];
   
        Son * son = [[Son alloc]init];
               Son * son1 = [[Son alloc]init];
               Son * son2 = [[Son alloc]init];
               Son * son3 = [[Son alloc]init];
    
        
    }
    return 0;
}
------------------------load-----------------------------------------
2019-10-23 13:46:03.090877+0800 load+initialize[2697:156107] +[Person load]
2019-10-23 13:46:03.091536+0800 load+initialize[2697:156107] +[Son load]
2019-10-23 13:46:03.091603+0800 load+initialize[2697:156107] +[Person(Category) load]
2019-10-23 13:46:03.091728+0800 load+initialize[2697:156107] main, Hello World!
------------------------initialize----------------------------------------
2019-10-23 13:46:03.091937+0800 load+initialize[2697:156107] +[Person initialize]
2019-10-23 13:46:03.092105+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092155+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092196+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092236+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092276+0800 load+initialize[2697:156107] +[Son initialize]
2019-10-23 13:46:03.092318+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092371+0800 load+initialize[2697:156107] -[Son init]
2019-10-23 13:46:03.092411+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.092448+0800 load+initialize[2697:156107] -[Son init]
2019-10-23 13:46:03.092487+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.094391+0800 load+initialize[2697:156107] -[Son init]
2019-10-23 13:46:03.094461+0800 load+initialize[2697:156107] -[Person init]
2019-10-23 13:46:03.094511+0800 load+initialize[2697:156107] -[Son init]
  • 發(fā)現(xiàn)無(wú)論你初始化多少次 initialize方法 有且只會(huì)調(diào)用一次

總結(jié)

load

  • load的方法編譯器自動(dòng)調(diào)用 每個(gè)類(lèi)都會(huì)調(diào)用 并且在main函數(shù)之前調(diào)用
  • 每個(gè)類(lèi)的調(diào)用順序跟項(xiàng)目加載的順序有關(guān)具體請(qǐng)看項(xiàng)目-->TARGETS —>Build Phases -->Compile Sources -加載的順序(從上往下調(diào)用)
  • 繼承關(guān)系并且父類(lèi)實(shí)現(xiàn)分類(lèi) 順序?yàn)?父類(lèi) ->子類(lèi)->分類(lèi)

initialize

  • 類(lèi)初始化的時(shí)候調(diào)用 無(wú)論類(lèi)初始化多少次 只會(huì)調(diào)用一次(在類(lèi)第一次初始化之前)

  • 如果類(lèi)有分類(lèi)那么分類(lèi)的initialize方法會(huì)將類(lèi)本身的initialize方法替換掉將昭躺,(說(shuō)白了類(lèi)的initialize方法不會(huì)調(diào)用了 分類(lèi)的initialize方法會(huì)調(diào)用) 分類(lèi)的方法執(zhí)行 有且只調(diào)用一次

  • 調(diào)用順序 父類(lèi)的intialize方法執(zhí)行 子類(lèi)在執(zhí)行 父類(lèi)-->子類(lèi)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忌锯,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窍仰,更是在濱河造成了極大的恐慌汉规,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驹吮,死亡現(xiàn)場(chǎng)離奇詭異针史,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)碟狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)啄枕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人族沃,你說(shuō)我怎么就攤上這事频祝。” “怎么了脆淹?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵常空,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盖溺,道長(zhǎng)漓糙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任烘嘱,我火速辦了婚禮昆禽,結(jié)果婚禮上蝗蛙,老公的妹妹穿的比我還像新娘。我一直安慰自己醉鳖,他們只是感情好捡硅,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著盗棵,像睡著了一般壮韭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上漾根,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天泰涂,我揣著相機(jī)與錄音鲫竞,去河邊找鬼辐怕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛从绘,可吹牛的內(nèi)容都是我干的寄疏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼僵井,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼陕截!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起批什,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤农曲,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后驻债,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體乳规,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年合呐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了暮的。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡淌实,死狀恐怖冻辩,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拆祈,我是刑警寧澤恨闪,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站放坏,受9級(jí)特大地震影響咙咽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轻姿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一犁珠、第九天 我趴在偏房一處隱蔽的房頂上張望逻炊。 院中可真熱鬧,春花似錦犁享、人聲如沸余素。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)桨吊。三九已至,卻和暖如春凤巨,著一層夾襖步出監(jiān)牢的瞬間视乐,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工敢茁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留佑淀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓彰檬,卻偏偏與公主長(zhǎng)得像伸刃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子逢倍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355