美文网首页iOS开发学习
OC 中load和initialize的区别

OC 中load和initialize的区别

作者: BEYOND黄 | 来源:发表于2017-06-08 01:22 被阅读23次

+ (void)load;

+ (void)initialize;

load:load方法在这个文件被程序装载时调用。只要是在Compile Sources中出现的文件总是会被装载,这与这个类是否被用到无关,因此load方法总是在main函数之前调用。

int main(intargc,char* argv[]) {

@autoreleasepool{

NSLog(@"main");

returnUIApplicationMain(argc, argv,nil,NSStringFromClass([AppDelegateclass]));

}

+ (void)load{

NSLog(@"load");

}

+(void)initialize{

NSLog(@"initialize");

}

打印结果

一。load特点:

1.当这个类被引用到程序中,就会执行一次这个类的load方法且只有一次。对于加入运行期系统中的每个类(class)及分类(category)来说,都会调用此方法,且只会调用一次。如果分类和其所属的类都调用了load方法,则先调用类里面的,再调用分类里的。

2.如果一个类实现了load方法,在调用这个方法前会首先调用父类的load方法。而且这个过程是自动完成的,并不需要我们手动实现。如果类里没有load方法,不管其父类有没有load方法,都不会在执行子类load方法时执行父类的load方法。

先执行父类的load方法,在执行这个类的load方法

用途:比如说你想要自定义导航栏,那么你就可以用load方法

+ (void)load

{

UINavigationBar*navBar = [UINavigationBarappearanceWhenContainedIn:self,nil];

//只要是通过模型设置,都是通过富文本设置

//设置导航条标题=> UINavigationBar

NSMutableDictionary*attrs = [NSMutableDictionarydictionary];

attrs[NSFontAttributeName] = [UIFontboldSystemFontOfSize:20];

[navBarsetTitleTextAttributes:attrs];

//设置导航条背景图片

[navBarsetBackgroundImage:[UIImageimageNamed:@"navigationbarBackgroundWhite"]forBarMetrics:UIBarMetricsDefault];

[navBarsetTitleTextAttributes:[NSDictionarydictionaryWithObjectsAndKeys:[UIColorwhiteColor],NSForegroundColorAttributeName,nil]];

}

二。initialize方法特点:

1. initialize的自然调用是在第一次主动使用当前类的时候。只会调用一次。

2. 和load不同,即使子类不实现initialize方法,会把父类的实现继承过来调用一遍。注意的是在此之前,父类的方法已经被执行过一次了,同样不需要super调用。

父类:

+(void)initialize{

NSLog(@"initializeParent--%@",[selfclass]);

}

子类:没有实现initalize方法

打印结果看出调用了两次父类的方法。

第一次是创建的父类对象执行了这个方法,因为在创建子类对象前要先创建父类对象,第二次是子类继承父类的方法执行这个方法。所以正确的写法是:

+(void)initialize{

if(self==[ViewControllerclass]){

NSLog(@"initializeParent--%@",[selfclass]);

}

}

相同点:

1.load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

2.在不考虑开发者主动使用的情况下,系统最多会调用一次。

3.都不需要super。

不同点:

1.load方法通常用来进行Method Swizzle,initialize方法一般用于初始化全局变量或静态变量。

2.调用时间不同。

3.load不遵守继承规则,即子类如果没有load方法,那么在要执行子类load方法时不会执行父类load方法。

initialize遵守继承的规则,即子类不管有没有这个方法,都会执行父类的这个方法。

相关文章

  • OC中的load和initialize的区别

    OC中的load和initialize的区别 调用方式load是根据函数地址直接调用initialize是通过ob...

  • iOS学习回顾

    oc部分 1. load和initialize的区别(利用load方法,MJRefresh在app启动时 在UIT...

  • load、initialize详解及区别

    load、initialize方法的区别? load、initialize的调用顺序? load initialize

  • OC 中load和initialize的区别

    + (void)load;+(void)initialize; load:load方法在这个文件被程序装载时调用。...

  • OC中load 和initialize 的区别

    OC文件在编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的信息会...

  • OC中load和initialize的区别

    OC文件在编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的信息会...

  • OC 中 load 和 initialize 的区别

    load: +load是一个类方法,当程序载入时,在main函数执行之前,带有+load方法类(Class)或者种...

  • OC中load和initialize的区别

    OC文件在编译后,类相关的数据结构会保留在目标文件中,在运行时得到解析和使用。在应用程序运行起来的时候,类的信息会...

  • 运行时的应用

    1、load和initialize的区别 +load和+initialize是 Objective-C runti...

  • 技术点

    1、oc中 load 和initialize 方法的异同? 连接 load 方法: 对于每个类(class)及分类...

网友评论

    本文标题:OC 中load和initialize的区别

    本文链接:https://www.haomeiwen.com/subject/fzczfxtx.html