initialize 方法在类第一次初始化时调用,且仅调用一次。
下面是实例测试:
在各个测试类中实现initialize 方法。
+ (void)initialize {
NSLog(@"%s",__FUNCTION__);
}
场景一: 只创建父类Parent
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[Parent new];
[Parent new];
}
@end
运行结果
TestOne[86372:2987462] +[Parent initialize]
说明当多次初始化Parent时,initialize 方法只调用一次。
场景二: 创建子类Child,继承父类Parent
@interface Child : Parent
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[Child new];
}
@end
运行结果
TestOne[86470:2994131] +[Parent initialize]
TestOne[86470:2994131] +[Child initialize]
说明子类会先调用父类的initialize方法,再调用自己的
场景三:父类先初始化,子类再初始化
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[Parent new];
[Child new];
}
@end
运行结果:
TestOne[86521:2997339] +[Parent initialize]
TestOne[86521:2997339] +[Child initialize]
通过单步调试可知,+[Parent initialize]是Parent实例化时打印,Child实例化时并没有调用Parent的initialize方法。
场景四:添加父类Parent的分类
@interface Parent (initialize)
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[Parent new];
}
@end
运行结果:
TestOne[86621:3004007] +[Parent(initialize) initialize]
只调用了分类的initialize方法 。
场景四:再添加子类Child的分类
@interface Child (initialize)
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
[Parent new];
[Child new];
}
@end
运行结果
TestOne[86657:3006670] +[Parent(initialize) initialize]
TestOne[86657:3006670] +[Child(initialize) initialize]
结果都只调用了分类的initialize方法。
还有父类,子类,父类分类,子类分类他们中间某个不实现initialize方法的情况,这就不一一列举了。最后的结论是:
1. initialize方法只在该类第一次实例化时调用。
2. 如果分类存在initialize方法,那么只执行分类的initialize方法