Objetive-C initialize研究
- initialize执行时机
在向一个类执行实例方法或者类方法(除了initialize和load方法之外)的时候,触发initialize方法,因此如果一个类你没有使用的时候,是不会执行的。
- initialize的执行顺序和次数
initialize的执行顺序和普通方法一样遵从方法转发的规律,因此一个子类没有重载initialize方法时,将会调用父类的initialize方法。
在扩展中重载这个方法中时,会覆盖掉原有类中得initialize方法,多个扩展覆盖initialize方法,将导致不确定的结果。
initialize子类只会执行一次,对于父类来说,可能会来自子类的调用,可能执行多次
下面是一个demo,说明一个initialize的执行规律
@interface initTest : NSObject
@end @interface sub1 : initTest @end @interface sub2 : sub1 @property (nonatomic, strong) NSString *kvoTestStr; @end @interface sub2 (category1) @end @interface sub2 (category2) @end
@implementation initTest
//+(void)initialize //{ // NSLog(@"%s|%@ ",__func__ ,[self class]); //} +(void)load { NSLog(@"%s ",__func__ ); } @end @implementation sub1 +(void)initialize { NSLog(@"%s|%@ ",__func__ ,[self class]); } //+(void)load //{ // NSLog(@"%s ",__func__ ); //} @end @implementation sub2 //+(void)initialize //{ // NSLog(@"%s|%@ ",__func__ ,[self class]); //} +(void)load { NSLog(@"%s ",__func__ ); } @end @implementation sub2 (category1) //+(void)initialize //{ // NSLog(@"%s|%@ ",__func__ ,[self class]); //} +(void)load { NSLog(@"%s ",__func__ ); } @end @implementation sub2 (category2) //+(void)initialize //{ // NSLog(@"%s|%@ ",__func__ ,[self class]); //} +(void)load { NSLog(@"%s ",__func__ ); } @end
|
执行结果
2015-05-26 13:44:58.757 OCinitTest[80219:72734510] +[initTest load]
2015-05-26 13:44:58.758 OCinitTest[80219:72734510] +[sub2 load] 2015-05-26 13:44:58.759 OCinitTest[80219:72734510] +[sub2(category1) load] 2015-05-26 13:44:58.759 OCinitTest[80219:72734510] +[sub2(category2) load] 2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|sub1 2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|sub2
2015-05-26 13:44:58.863 OCinitTest[80219:72734510] +[sub1 initialize]|NSKVONotifying_sub2
|
- initialize的作用
在initialize中可以初始化一个单例。
static MySingleton *sharedSingleton;
+ (void)initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
sharedSingleton = [[MySingleton alloc] init];
}
}