1.initliaize了解。(系统认识,类方法,只调用一次)
调用时机:在此类接受第一个消息时调用
父类子类的调用关系:父类和子类中都会调用,先调用父类,在调用子类。(子类中为实现会调用父类的隐式的调用父类的方法来初始化子类)
父类和本类的调用关系:调用分类中的实现,忽略本类中的实现(不会都调用)
实例:
@interface Person:NSObject
@end
@implementation Person
+(void)initialize{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface Student:Person
@end
@implementation Student
//1.不实现
/*
//1.显示的调用父类的
+(void)initialize{
[super initialize];
}
*/
//2.实现自己的方法
+ (void)initialize{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface Student (love)
@end
@implementation Student (love)
//3.当在父类中实现initialize方法
+ (void)initialize{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
/*
//1.//当不实现,或者显示的调用父类的方法时,子类在initliaize中会调用一次父类的方法。
Student *s1 = [[Student alloc] init];
2018-01-15 11:09:10.759770+0800 initliaize和load[16694:1036233] +[Person initialize]
2018-01-15 11:09:10.759923+0800 initliaize和load[16694:1036233] +[Person initialize]
*/
/*
//2.当实现了自己类中的方法时,先调用父类的实现,在调用子类中实现(这与oc对象的初始化顺序有关,oc对对象的初始化是先父类,再子类)
Student *s1 = [[Student alloc] init];
//2018-01-15 11:36:26.414407+0800 initliaize和load[16974:1080382] +[Person initialize]
//2018-01-15 11:36:26.414521+0800 initliaize和load[16974:1080382] +[Student initialize]
*/
/*
//3.当分类中实现initliaize方法时,在初始化此类的时候,只会调用此类中分类的方法,而忽略本类中的实现。
Student *s1 = [[Student alloc] init];
//2018-01-15 11:46:32.080362+0800 initliaize和load[17069:1098190] +[Person initialize]
//2018-01-15 11:46:32.080494+0800 initliaize和load[17069:1098190] +[Student(love) initialize]
*/
//4.再次实例化或者对这个对象发消息时,不会再调用initliaize方法了(这个方法只调用一次,其实我们可以把这个方法理解成类的初始化方法)
/*
再次实例化的时候得到的结果和单独实例化s1的结果是一样的,
这是个类方法只会在此类接受第一个消息之前调用一次,(有人说父类的方法调用了两次,但是是因为我们再子类中没有实现或者显示的调用了父类的方法,所以子类中的调用去掉用了父类的方法,实际的情况是子类接受了第一个消息之前调用了一次子类的initliaize方法,父类被触发接受了第一个消息,调用了一次自己的initliaize方法。)
*/
}
2.+(void)load理解:(系统认识:也是类方法,只在runtime调用一次)
调用时机:在APP运行时调用。
父类和子类的调用:那个类实现了就调用那个类的,顺序是先调用父类,再子类,两者没有直接关系。
分类和本类的关系:都会调用(顺序是先本类,再分类)
实例:
@interface Person:NSObject
@end
@implementation Person
+ (void)load{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface Student:Person
@end
@implementation Student
//1.子类中未实现
//2.子类中实现了
+ (void)load{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface Student (love)
@end
@implementation Student (love)
//3.分类中实现了
+ (void)load{
NSLog(@"%s",__FUNCTION__);
}
@end
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
/*
//1.子类中未实现(load)方法,不会沿用父类的(就是说,本类中没有实现,在本类中就不会调用,只会初始化父类的时候调用父类的)
2018-01-15 14:15:09.707632+0800 initliaize和load[18101:1198007] +[Person load]
*/
/*
//2.子类中实现了。就先调用父类再子类
2018-01-15 14:16:24.727876+0800 initliaize和load[18131:1200687] +[Person load]
2018-01-15 14:16:24.728594+0800 initliaize和load[18131:1200687] +[Student load]
*/
/*
//3.分类中实现了,都会调用,顺序是本类后分类
2018-01-15 14:22:57.415810+0800 initliaize和load[18209:1212252] +[Person load]
2018-01-15 14:22:57.416510+0800 initliaize和load[18209:1212252] +[Student load]
2018-01-15 14:22:57.416700+0800 initliaize和load[18209:1212252] +[Student(love) load]
*/
}