OC中initialize&& load && init方法

本文探讨了Objective-C中类的加载与初始化过程,详细解释了+load与+initialize方法的区别及调用时机,以及它们如何与Category交互。此外,还介绍了实例方法-init的执行流程,并通过一个父子类的示例代码展示了这些方法的具体调用顺序。

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

1.+load
+load方法在类加载到系统的时候调用
+load方法调用的时候尚未有自动释放池,所以如果+load中的内容使用到了自动释放池,则代码需要用@autoreleasepool{}包含。 另外,对应Category中的+load方法并不会覆盖类自身中的+load方法,两个+load方法都会调用,而且Category的+load方法在类自身的+load方法之后调用。

2 +initialize
+initialize方法在一个比较安全的环境中调用,比+load更适合放入初始化代码。+initialize方法在类首次收到消息时调用,若此类一直没有使用,则+initialize就不会调用。 与+load方法类似的时,在向子类发送initialize消息前,总是会先向父类发送initialize消息,如果父类尚未调用+initialize方法则调
Category中的+initialize方法会覆盖类本身的+initialize方法。如果父类中实现了+initialize方法,而子类中没有重写此方法,则子类初始化时就会使用父类的方法
3-init
-init方法用于初始化实例对象,
4. alloc+init <————> new
源码:

+ new
{
id newObject = (*_alloc)((Class)self, 0);
Class metaClass = self->isa;
if (class_getVersion(metaClass) > 1)
    return [newObject init];
else
    return newObject;
}
+ alloc
{
return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
}
- init
{
    return self;
}

三个方法的执行顺序:
1.使用实例方法
直接上代码:

@interface Father : NSObject
+(void)hello;
@end
@interface Son : Father
+(void)hello;
-(void)good;
@end
@implementation Father
+(void)initialize
{
    NSLog(@"father initialize %s",__FUNCTION__);
}
+(void)hello
{
    NSLog(@"father say hello %s",__FUNCTION__);
}

-(instancetype)init
{

    if (self==[super init]) {
        NSLog(@"father initialize %s",__FUNCTION__);
    }

    return self;
}
+(void)load
{
    NSLog(@"father say load %s",__FUNCTION__);
}
@end
@implementation Son
+(void)initialize
{
    NSLog(@"son initialize %s",__FUNCTION__);
}
+(void)hello
{
    NSLog(@"son say hello %s",__FUNCTION__);
}
+(void)load
{
    NSLog(@"son say load %s",__FUNCTION__);
}


-(instancetype)init
{

    if (self==[super init]) {
         NSLog(@"son initialize %s",__FUNCTION__);
    }

    return self;
}

-(void)good
{
    NSLog(@"son say good %s",__FUNCTION__);
}
@end

@interface Son(Category)

@end
@implementation Son (Category)

+(void)load
{
    NSLog(@"sonCategory say load %s",__FUNCTION__);
}
-(void)goodbye
{
    NSLog(@"sonCategory say goodbye %s",__FUNCTION__);
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
//        [Father hello];
//        [Son hello];
//        [[[Son alloc]init]good];
//        [Son hello];
        [[[Son alloc]init]goodbye];
    }
    return 0;
}

father say load +[Father load]
son say load +[Son load]
sonCategory say load +[Son(Category) load]
father initialize +[Father initialize]
son initialize +[Son initialize]
father initialize -[Father init]
son initialize -[Son init]
sonCategory say goodbye -[Son(Category) goodbye]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值