Person
#pragma mark - Person
@interface Person : NSObject
@end
@implementation Person
+ (void)load {
printf("%s\n", __func__);
}
+ (void)initialize {
printf("%s\n", __func__);
}
- (instancetype)init {
self = [super init];
if (self) {
printf("%s\n", __func__);
}
return self;
}
@end
Person Category
#pragma mark - Person (Male)
@interface Person (Category)
@end
@implementation Person (Category)
+ (void)load {
printf("%s\n", __func__);
}
@end
Father
#pragma mark - Father
@interface Father : Person
@end
@implementation Father
+ (void)load {
printf("%s\n", __func__);
}
+ (void)initialize {
printf("%s\n", __func__);
}
- (instancetype)init {
self = [super init];
if (self) {
printf("%s\n", __func__);
}
return self;
}
@end
Step 1
int main(int argc, const char * argv[]) {
@autoreleasepool {
}
return 0;
}
運(yùn)行程序,我們看一下輸出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
Step 2
int main(int argc, const char * argv[]) {
@autoreleasepool {
[Person description];
}
return 0;
}
運(yùn)行程序瓜喇,我們看一下輸出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]
Step 3
int main(int argc, const char * argv[]) {
@autoreleasepool {
[Person new];
}
return 0;
}
運(yùn)行程序挺益,我們看一下輸出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]
-[Person init]
Step 4
int main(int argc, const char * argv[]) {
@autoreleasepool {
[Father new];
}
return 0;
}
運(yùn)行程序,我們看一下輸出日志:
+[Person load]
+[Father load]
+[Person(Category) load]
+[Person initialize]
+[Father initialize]
-[Person init]
-[Father init]
>根據(jù)上面的現(xiàn)象可知:
+load
:程序運(yùn)行時(shí)自動調(diào)用
+initialize
:第一次用到這個(gè)類時(shí)調(diào)用乘寒,只會調(diào)用一次
-init
:對象的初始化方法望众,創(chuàng)建對象時(shí)調(diào)用
程序啟動,目中所有類的+load
方法調(diào)用肃续,創(chuàng)建對象父類先調(diào)用+initialize
黍檩,然后是子類的+initialize
,然后是父類的-init
始锚,最后是自己的-init
;