ios-load和initialize

一、ios中的load和initialize的简单介绍

load方法当类被加载到OC运行时环境中的时候就会调用,其实就是被加载进内存,一个类只会加载一次,我们如果要设置单例也完全可以在这个方法中进行创建,头文件参与了编译也会调用下面的方法

+(void)load
{
    
}
当第一次使用这个类的时候就会调用

+(void)initialize
{
    
}

load是比initialize先调用的,initialize可能是我们在创建子类alloc init的时候也会去调用父类的initialize方法。因为init的时候会用到super init。

initialize不一定只调用一次,比如说我们创建一个子类,如果只有父类的方法写了initialize的方法,那么就会调用两次父类的initialize的方法. 比如下面有一个Student类

@implementation Student
+(void)initialize
{
    NSLog(@"Student");
    
}
@end

还有个Student1的子类,什么都没写

@implementation Student1

@end

当我们去创建一个子类对象的时候,父类实现的initialize会被调用两次,因为[super init]会调用,而且虽然子类没有实现initialize方法,但还是会调用会使用父类的+(void)initialize。

Student1 * student = [[Student1 alloc]init];

所以如果子类不实现初始化(运行时将调用继承的实现),或者子类显式调用[super initialize],超类实现可能会被多次调用。如果希望保护自己不被多次运行,我们可以按照以下的方式来构造我们的实现: 其中Student就是可以改为你当前类的名字

@implementation Student
+ (void)initialize {
    if (self == [Student self]) {
        // ... do the initialization ...
        NSLog(@"Student");
    }
}
@end

因为初始化被称为阻塞方式,所以将方法实现限制到尽可能少的工作是很重要的。

我们一般是在initialize 方法中进行一些常量的初始化,初始化全局变量和静态变量。

load方法在main函数之前调用,initialize在main函数之后调用。initialize方法可以说是一种惰性调用,也就是说如果一个类一直没被用到,那它的initialize方法也不会被调用,这一点有利于节约资源。

二、补充概念

如果说我们有一个类Student,它有一个分类Student+Extension,而且两个类都是写了load方法的话,那么Student类的load方法会先被调用,然后再调用子类的load方法,然后再调用main方法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值