+ (void)initialize方法解释

本文揭示了initialize方法的调用特性,包括在类初次实例化时执行、子类继承调用、分类行为以及不实现情况。深入解析了父类、子类、分类对initialize调用的影响,是iOS/OC程序员必备的初始化知识指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值