iOS load方法探究
之前對(duì)某個(gè)類(lèi)做Method Swilzzing
都選擇在該類(lèi)的category中重寫(xiě)+ (void)load;
方法, 相關(guān)方法交互的邏輯都寫(xiě)在該方法中.一直有一個(gè)疑惑,按照類(lèi)的方法加載方式, 多個(gè)category都重寫(xiě)一個(gè)方法,那最終只會(huì)有一個(gè)方法會(huì)被真正調(diào)用到.那在category重寫(xiě)load方法是不是會(huì)無(wú)效?
我們實(shí)際寫(xiě)個(gè)demo,從以下幾個(gè)問(wèn)題分析下load方法,來(lái)解答我們的疑惑!
-
load方法什么時(shí)候調(diào)用
創(chuàng)建一個(gè)
LoadObject
對(duì)象, 在其m文件中重寫(xiě)load方法, 同時(shí)在main
函數(shù)中打印log
#import "LoadObject.h"
@implementation LoadObject
+ (void)load{
NSLog(@"%s",__func__);
}
@end
int main(int argc, char * argv[]) {
@autoreleasepool {
NSLog(@"%s",__func__);
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
輸出:
2018-04-13 10:36:35.057750+0800 LoadMethodDemo[39024:1218412] +[LoadObject load]
2018-04-13 10:36:35.059119+0800 LoadMethodDemo[39024:1218412] main
結(jié)論: 類(lèi)的load方法的調(diào)用發(fā)生在app main函數(shù)之前
-
category中重寫(xiě)load方法
為L(zhǎng)oadObject類(lèi)添加叫One的category
// LoadObject+One.m
@implementation LoadObject (One)
+ (void)load{
NSLog(@"%s",__func__);
}
@end
輸出:
2018-04-13 10:41:25.847033+0800 LoadMethodDemo[39127:1224463] +[LoadObject load]
2018-04-13 10:41:25.848094+0800 LoadMethodDemo[39127:1224463] +[LoadObject(One) load]
2018-04-13 10:41:25.848461+0800 LoadMethodDemo[39127:1224463] main
結(jié)論:
1. 類(lèi)本身的load方法和category方法都被調(diào)用了
2. 類(lèi)本身的load方法比category方法先調(diào)用
那我們?cè)囋嚩鄠€(gè)category都重寫(xiě)load方法
再添加一個(gè)category,并重寫(xiě)load方法
// LoadObject+Two.m"
@implementation LoadObject (Two)
+ (void)load{
NSLog(@"%s",__func__);
}
@end
輸出:
2018-04-13 10:44:56.270561+0800 LoadMethodDemo[39206:1228739] +[LoadObject load]
2018-04-13 10:44:56.274700+0800 LoadMethodDemo[39206:1228739] +[LoadObject(Two) load]
2018-04-13 10:44:56.275680+0800 LoadMethodDemo[39206:1228739] +[LoadObject(One) load]
2018-04-13 10:44:56.276437+0800 LoadMethodDemo[39206:1228739] main
結(jié)論: 所有分類(lèi)中的
load
方法都會(huì)被調(diào)用
-
父類(lèi)load方法
創(chuàng)建
LoadObject
的子類(lèi)SubLoadObject
, 并且為其添加兩個(gè)category, 分別重寫(xiě)load方法
//SubLoadObject.m
@implementation SubLoadObject
+ (void)load{
NSLog(@"%s",__func__);
}
@end
#import "SubLoadObject+One.h"
@implementation SubLoadObject (One)
+ (void)load{
NSLog(@"%s",__func__);
}
@end
#import "SubLoadObject+Two.h"
@implementation SubLoadObject (Two)
+ (void)load{
NSLog(@"%s",__func__);
}
@end
輸出:
2018-04-13 10:50:32.572034+0800 LoadMethodDemo[39336:1233577] +[LoadObject load]
2018-04-13 10:50:32.573519+0800 LoadMethodDemo[39336:1233577] +[SubLoadObject load]
2018-04-13 10:50:32.573761+0800 LoadMethodDemo[39336:1233577] +[SubLoadObject(One) load]
2018-04-13 10:50:32.574037+0800 LoadMethodDemo[39336:1233577] +[SubLoadObject(Two) load]
2018-04-13 10:50:32.574282+0800 LoadMethodDemo[39336:1233577] +[LoadObject(Two) load]
2018-04-13 10:50:32.574532+0800 LoadMethodDemo[39336:1233577] +[LoadObject(One) load]
2018-04-13 10:50:32.575050+0800 LoadMethodDemo[39336:1233577] main
結(jié)論:
- 父類(lèi)的load方法先于子類(lèi)調(diào)用
- 所有類(lèi)本身的load方法先于category中的load方法調(diào)用
- category中的load方法調(diào)用順序好像隨機(jī)?
=========
總體結(jié)論:
- load方法調(diào)用發(fā)生在mian函數(shù)之前
- 類(lèi)本身load方法和category中的load方法都會(huì)被調(diào)用
- 類(lèi)本身load方法調(diào)用先于所有類(lèi)的category類(lèi)中的load方法調(diào)用
====