在 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.
}
啓動項目,運行結果以下:
由此得出結論
load
和initialize
方法都會在實例化對象以前調用,以main函數爲分水嶺,前者在main函數以前調用,後者在以後調用。