iOS load方法與initialize方法

2022-07-14 10:51:06 字數 3697 閱讀 1427

在 ios 開發中,我們經常會使用 +load 方法來做一些在main函式之前的操作,比如方法交換(method swizzle)等。現在分析一下load方法跟initialize方法的呼叫順序以及區別。

1.先看下load方法

嘗試定義乙個繼承自nsobjectperson類,並對其新增兩個分類lifework;再定義乙個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.

啟動專案,執行結果如下:

由此得出結論

loadinitialize方法都會在例項化物件之前呼叫,以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 常見錯誤 呼叫方法時不能指定實參型別 形參和實參資料型別不一致 數量也要一致 方法傳參 基本資料型別和引用資料型別在傳參是區別 基本資料型別,操作傳遞的是變數的值,改變乙個變數的值...