在 ios 開發中,我們經常會使用 +load 方法來做一些在main
函式之前的操作,比如方法交換(method swizzle)等。現在分析一下load方法跟initialize方法的呼叫順序以及區別。
1.先看下load方法
嘗試定義乙個繼承自nsobject
的person
類,並對其新增兩個分類life
和work
;再定義乙個student
類繼承自person
,並對其新增school
分類。在以上所有類和分類中,均實現 +load:
#import "person.h"
@implementationperson
+ (void)load {
nslog(@"person %s",__func__);
@end
#import "person+life.h"
@implementationperson (life)
+ (void)load {
nslog(@"person+life %s",__func__);
@end
#import "person+work.h"
@implementationperson (work)
+ (void)load {
nslog(@"person+work %s",__func__);
@end
#import "student.h"
@implementationstudent
+ (void)load {
// [super load];
nslog(@"student %s",__func__);
@end
#import "student+school.h"
@implementationstudent (school)
+ (void)load {
nslog(@"student+school %s",__func__);
@end
啟動專案,列印結果如下,說明+load 方法會在main
函式之前被呼叫;且呼叫順序總是先父類再子類再分類。
當我們在乙個類的子類的 +load 中[super load]
又會呼叫到到底哪個類中呢(當然,在實際開發中這種情幾乎不可能存在)?答案就是[super load]
將呼叫到person
最後乙個被編譯的分類(person+work
)中的+load
方法,因為這裡是訊息傳送,而不是通過方法指標。
應用:因為類或者分類一旦被載入到執行時,就會呼叫這個方法;因為載入時間特別早:所以可以利用這個特性進行一些處理
2.之後分析 initialize方法
在person與student類中新增init方法跟initialize方法,然後在 viewcontroller 中建立 person 和 student 物件,如下:
#import "person.h"
@implementationperson
-(instancetype)init{
if(self= [superinit]) {
nslog(@"%s",__func__);
returnself;
+ (void)load {
nslog(@"person %s",__func__);
+ (void)initialize{
nslog(@"person %s",__func__);
@end
#import "student.h"
@implementationstudent
-(instancetype)init{
if(self= [superinit]) {
nslog(@"%s",__func__);
returnself;
+ (void)load {
nslog(@"student %s",__func__);
+ (void)initialize{
nslog(@"student %s",__func__);
@end
@implementationviewcontroller
- (void)viewdidload {
[superviewdidload];
nslog(@"%s",__func__);
person * per = [[person alloc]init];
student * stu = [[student alloc]init];
// do any additional setup after loading the view, typically from a nib.
啟動專案,執行結果如下:
由此得出結論
load
和initialize
方法都會在例項化物件之前呼叫,以main函式為分水嶺,前者在main函式之前呼叫,後者在之後呼叫。
initialize方法的呼叫順序是先父類再子類;是以懶載入的方式被呼叫的;
iOS load方法執行順序
1 load方法是在main函式執行前執行的 2 load方法是在載入類和分類時系統呼叫,一般不手動呼叫,如果想要在類或分類載入時做一些事情,可以重寫類或分類的 load方法。3 類 分類的 load方法,在程式執行過程只呼叫一次。呼叫順序 1 類要優先於分類呼叫 load方法 2 子類呼叫 loa...
構造方法與方法
size large b align center 構造方法知識總結 align b size size medium 1.構造方法的特點,1 任何乙個類在定義時,系統會預設乙個無參的構造方法,即 public student 2 構造方法的唯一作用就是來建立物件 3 構造方法不用宣告返回值型別,但...
方法與方法過載
定義帶引數的方法 訪問修飾符 返回型別 方法名 形式引數列表 呼叫帶引數的方法 物件名.方法名 引數1,引數2,引數n 常見錯誤 呼叫方法時不能指定實參型別 形參和實參資料型別不一致 數量也要一致 方法傳參 基本資料型別和引用資料型別在傳參是區別 基本資料型別,操作傳遞的是變數的值,改變乙個變數的值...