iOS load方法與initialize方法

在 iOS 開發中,咱們常常會使用 +load 方法來作一些在 main 函數以前的操做,好比方法交換(Method Swizzle)等。如今分析一下load方法跟initialize方法的調用順序以及區別。函數

1.先看下load方法指針

嘗試定義一個繼承自 NSObject 的 Person 類,並對其添加兩個分類 Life 和 Work;再定義一個 Student 類繼承自 Person,並對其添加 School 分類。在以上全部類和分類中,均實現 +load:code

#import "Person.h"對象

 

@implementation Personblog

+ (void)load {繼承

    NSLog(@"Person %s", __func__);開發

}it

@endio

 

#import "Person+Life.h"編譯

 

@implementation Person (Life)

+ (void)load {

    NSLog(@"Person+Life %s", __func__);

}

 

@end

 

 

 

#import "Person+Work.h"

 

@implementation Person (Work)

+ (void)load {

    NSLog(@"Person+Work %s", __func__);

}

 

@end

 

#import "Student.h"

 

@implementation Student

+ (void)load {

//    [super load];

    NSLog(@"Student %s", __func__);

}

@end

 

 

#import "Student+School.h"

 

@implementation Student (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"

 

@implementation Person

-(instancetype)init{

    if (self = [super init]) {

        NSLog(@"%s",__func__);

    }

    return self;

}

+ (void)load {

    NSLog(@"Person %s", __func__);

}

+ (void)initialize{

    NSLog(@"Person %s",__func__);

}

@end

 

#import "Student.h"

 

@implementation Student

-(instancetype)init{

    if (self = [super init]) {

        NSLog(@"%s",__func__);

    }

    return self;

}

+ (void)load {

    NSLog(@"Student %s", __func__);

}

+ (void)initialize{

    NSLog(@"Student %s",__func__);

}

@end



@implementation ViewController

 

- (void)viewDidLoad {

    [super viewDidLoad];

    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.

}

 

啓動項目,運行結果以下:

 

由此得出結論

  1. loadinitialize方法都會在實例化對象以前調用,以main函數爲分水嶺,前者在main函數以前調用,後者在以後調用。
  2. initialize方法的調用順序是先父類再子類;是以懶加載的方式被調用的;
相關文章
相關標籤/搜索