oc中 load,initialize,init方法对比总结

本文详细对比了Objective-C中类的+load、+initialize和-init方法的调用时机、顺序和特性。通过代码示例展示了load方法在程序启动时调用,不受编译顺序影响,而initialize方法在类首次使用时调用,子类会覆盖父类的initialize,分类的initialize和init方法可以覆盖主类。同时强调了不应过度依赖这些方法,以确保代码的稳定性和灵活性。

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

首先代码展示吧,后面也会附赠demo代码链接

1.定义测试类TestClass
//为了方便打印,先在宏定义文件里面定义ZWWLog

#ifdef DEBUG
#define ZWWLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
#define ZWWLog(...)
#endif

TestClass.m

+ (void)load{
    ZWWLog();
}

+ (void)initialize
{
    ZWWLog(@"TestClass 中的initialize方法执行 class:%@",[self class]);
}

- (instancetype)init{
    
    ZWWLog(@"TestClass 中的init方法执行 class:%@",[self class]);
    return [super init];
}

2.定义测试类TestClass的子类TestClassSon

TestClassSon.m

+ (void)load{
    ZWWLog();
}

+ (void)initialize
{
    ZWWLog();
}

- (instancetype)init
{
   
    ZWWLog();
    return [super init];
}

2.定义测试类TestClass的分类1TestClass (Method)

//不会覆盖主类的load
+ (void)load{
    ZWWLog();
}

//会覆盖主类的initialize
//+ (void)initialize
//{
//    if (self == [self class]) {
//        ZWWLog();
//    }
//}

//会覆盖主类的init方法
//- (instancetype)init
//{
//    ZWWLog(@"TestClass (Method) init方法执行");
//    self = [super init];
//    if (self) {
//
//    }
//    return self;
//}

2.定义测试类TestClass的分类2TestClass (Method1)

+ (void)load{
    ZWWLog();
}

//+ (void)initialize
//{
//    if (self == [self class]) {
//        ZWWLog();
//    }
//}

//- (instancetype)init
//{
//    ZWWLog(@"TestClass (Method1) init方法执行");
//    self = [super init];
//    if (self) {
//        
//    }
//    return self;
//}

好了,代码准备完毕,下面在控制器中调用类,根据打印结果总结结论:

在控制器中需要导入对应头文件

#import "TestClass.h"
#import "TestClassSon.h"
#import "TestClass+Method.h"
#import "TestClass+method1.h"

1.load方法测试:什么操作也不做,直接commond+b编译,打印如下:

2018-10-04 14:47:17.766168+0800 InterviewDemo[4064:619260] +[TestClass load] [Line 26]
2018-10-04 14:47:17.766824+0800 InterviewDemo[4064:619260] +[TestClassSon load] [Line 14]
2018-10-04 14:47:17.778301+0800 InterviewDemo[4064:619260] +[TestClass(Method) load] [Line 28]
2018-10-04 14:47:17.778399+0800 InterviewDemo[4064:619260] +[TestClass(method1) load] [Line 13]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值