initialize和load的区别

load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用

我自己创建了两个类,一个是father类,一个是child类,child类继承于father类。

现在我只要引用了father类
#import "Father.h"

两个类里面的initialize和load都会被执行。这是不是跟上面的描述“即使类文件被引用进来,但是没有使用,那么initialize也不会被调用”有矛盾?

这是father.m

#import "Father.h"

@implementation Father

+ (void)load
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}

+ (void)initialize
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}


- (void)test
{
    
}


@end

这是child.m

`#import "Child.h"

@implementation Child


+ (void)load
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}

+ (void)initialize
{
    NSLog(@"%@ %s", [self class], __FUNCTION__);
}


- (void)test
{
    
}



@end
阅读 3.5k
3 个回答

可以把NSLog(@"%@ %s", [self class], __FUNCTION__);去掉试试。
你调用了 [self class]方法,所以运行时会去调用initialize方法。

应该只会调用两个类的load方法,检查下是不是哪边实例化了,或者把代码贴出来看看。

外部调用,不可能是[self class]问题。如果是的话,就会导致死循环吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题