無意中看到這方面的內(nèi)容岖食,查了查寓搬,記錄下~
load
OC也是運行時語言,在運行之前肯定要加在程序里的一些類文件县耽,而這個load方法就是在加載類的時候調(diào)用的句喷,可以在里面做一些自己的處理。從NSObject類里看到這個方法表面上看起來跟其他的類方法沒有什么差別兔毙,但是其實是有差別的唾琼。其實可以嘗試下寫個類重寫下這個方法,會發(fā)現(xiàn)他的調(diào)用在main之前 澎剥,而且無關(guān)你有沒有使用這個類锡溯。并且如果父類子類及類別都重寫此方法,會發(fā)現(xiàn)調(diào)用的順序是父類-》子類-》類別。
load 方法 會在程序加載類文件的時候就會調(diào)用 無關(guān)乎這個類是否用到祭饭,所有程序里存在的類都會調(diào)用load方法芜茵,一般不在這個方法里做太多的事情。
如果子類父類及類別都復(fù)寫了這個方法倡蝙,會優(yōu)先調(diào)用父類九串,然后子類 ,最后再是類別寺鸥。
load方法調(diào)用時猪钮,系統(tǒng)處于脆弱狀態(tài),如果調(diào)用別的類的方法胆建,且該方法依賴于那個類的load方法進行初始化設(shè)置烤低,那么必須確保那個類的load方法已經(jīng)調(diào)用了,如果別的類還沒有裝載調(diào)用load方法笆载,就可能產(chǎn)生意想不到的異常扑馁,其實load方法的順序跟程序工程文件 里 complie source的加載順序有關(guān)。load方法的環(huán)境不穩(wěn)定凉驻,但是線程安全檐蚜。常見使用場景 也就是在load 里做 Method Swizzle,例如
+ (void)load {
Method originalFunc = class_getInstanceMethod([self class], @selector(originalFunc));
Method swizzledFunc = class_getInstanceMethod([self class], @selector(swizzledFunc));
method_exchangeImplementations(originalFunc, swizzledFunc);
}
一般來說沿侈,除了Method Swizzle闯第,別的邏輯都不應(yīng)該放在load方法中實現(xiàn)。
而initialize方法不同缀拭,會在你第一次使用的時候會調(diào)用咳短,調(diào)用的時候 運行環(huán)境基本已經(jīng)健全了
這個方法在第一次給某個類發(fā)送消息時調(diào)用(比如實例化一個對象),并且只會調(diào)用一次蛛淋。initialize方法實際上是一種惰性調(diào)用咙好,也就是說如果一個類一直沒被用到,那它的initialize方法也不會被調(diào)用褐荷,這一點有利于節(jié)約資源
與load方法不同之處在于勾效,即使子類沒有實現(xiàn)initialize方法,也會調(diào)用父類的方法叛甫,這會導(dǎo)致一個很嚴(yán)重的問題:[Man alloc]init] 之后調(diào)用倆次person的initialize 方法而子類Man并沒有實現(xiàn)initialize方法
雖然initialize方法對一個類而言只會調(diào)用一次层宫,但這里由于出現(xiàn)了兩個類,所以調(diào)用兩次符合規(guī)則其监,但不符合我們的需求萌腿。正確使用initialize方法的姿勢如下
+ (void)initialize {
if (self == [Parent class]) {
NSLog(@"Initialize Parent, caller Class %@", [self class]);
? ?}
}
一般做一些全局變量和靜態(tài)變量的初始化