在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理。而这正是本篇文章所要介绍的load和initialize方法可以帮我们做到的。

load和initialize的共同特点

load和initialize有很多共同特点,下面简单列一下:

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

● 如果父类和子类都被调用,父类的调用一定在子类之前

● 都是为了应用运行提前创建合适的运行环境

● 在使用时都不要过重地依赖于这两个方法,除非真正必要

+load方法

● 调用时机比较早,运行环境有不确定因素。具体说来,通常都是App启动前进行调用,当load调用的时候,并不能保证所有类都加载完成且可用,必要时还要自己负责做auto release处理.

● 对于一个类,如果没有实现load方法就不会调用,不会考虑对NSObject的继承.

● 父类的load方法会优先于子类调用,类别的load方法一般最后调用不会直接触发initialize的调用。

通俗的讲就是: 在程序启动之前会调用所有的类的(手动实现的)+load方法(没有实现就不调用咯),按(父类->子类->类别)的顺序调用.

+initialize方法

● initialize的自然调用是在第一次主动使用当前类的时候 (第一次 alloc 时)

● 在initialize方法收到调用时,运行环境基本健全。

● initialize的运行过程中是能保证线程安全的。

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

通俗的讲就是:在程序启动之后,在第一次创建这个类的对象的时候(也就是分配内存空间alloc的时候),会调用该类的+initialize方法且只调用一次.

[调用顺序 1.如果父类的initialize方法没有被调用过会先调用父类的initialize方法) 2.如果该类有类别只会调用类别的+initialize(如果有多个类别会调用某一个类别的initialize方法,其他的不会调用)]

由于initialize的这些特点,使得其应用比load要略微广泛一些。可用来做一些初始化工作,或者单例模式的一种实现方案。

Apple的文档很清楚地说明了initialize和load的区别在于:load是只要类所在文件被引用就会被调用,而initialize是在类或者其子类的第一个方法被调用前调用。所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么initialize也不会被调用。

	上代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch. NSLog(@"appdelegate"); self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor blackColor]; ViewController *vc = [[ViewController alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
self.window.rootViewController = nav; [self.window makeKeyAndVisible];
return YES;
}

如上 所有的+load方法会在 NSLog(@”appdelegate”) 之前被调用.

如图:

+(void)load方法的调用顺序:Father > Son > Daughter > GrandSon > Father+Cry > Son+Eat > Father+Laugh

而+initialize方法基本上都是在 NSLog(@”appdelegate”) 之后被调用.

如下

[Son alloc];

会触发父类 (如果父类没有被alloc过)的initialize方法,由于类别(Category)中的initialize方法会覆盖之前类别和类中的initialize方法,所以只会调用两个initialize方法 即 Father+LaughInitialize > Son+EatInitialize .

oc---类方法load和initialize的区别的更多相关文章

  1. Objective C类方法load和initialize的区别

    Objective C类方法load和initialize的区别   过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...

  2. 类方法load和initialize的区别

    1.+load方法当类或分类添加到object-c runtime时被调用,子类的+load方法会在它所有父类的+load方法之后执行,而分类的+load方法会在它的主类的+load方法之后执行.但不 ...

  3. IOS杂笔- 7(类方法load与initialize的区别 浅析)

    在介绍两种类方法之前,NSObject Class Reference里对这两个方法说明: +(void)initialize The runtime sends initialize to each ...

  4. iOS load和initialize的区别

    可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我 ...

  5. load 和 initialize 的区别

    官方文档 Apple的官方文档很清楚地说明了 initialize 和 load 的区别在于: load 是只要类所在文件被引用就会被调用,而 initialize 是在类或者其子类的第一个方法被调用 ...

  6. load、init和initialize的区别

    在NSObject.h中找到三个方法 + (void)load; + (void)initialize; - (instancetype)init 1. 可知三个方法类型,两个类方法,一个对象方法 2 ...

  7. 解读OC中的load和initialize

    在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Categor ...

  8. iOS---Objective-C: +load vs +initialize

    在 NSObject 类中有两个非常特殊的类方法 +load 和 +initialize ,用于类的初始化.这两个看似非常简单的类方法在许多方面会让人感到困惑,比如: 子类.父类.分类中的相应方法什么 ...

  9. 细说OC中的load和initialize方法

    OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...

随机推荐

  1. Linux基础:CentOS 6重置密码

    1.开机,按"e"键,进入GNU GRUB引导界面,上下键选择中间行 2.按"e"键,进入编辑界面,末行quiet后空格,输入"1"或者&q ...

  2. 22.re(正则表达式)

    转载:https://www.cnblogs.com/yuanchenqi/article/5732581.html 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Pyt ...

  3. 【一起学源码-微服务】Nexflix Eureka 源码八:EurekaClient注册表抓取 精妙设计分析!

    前言 前情回顾 上一讲 我们通过单元测试 来梳理了EurekaClient是如何注册到server端,以及server端接收到请求是如何处理的,这里最重要的关注点是注册表的一个数据结构:Concurr ...

  4. mysql锁及四种事务隔离级别笔记

    前言 数据库是一个共享资源,为了充分利用数据库资源,发挥数据 库共享资源的特点,应该允许多个用户并行地存取数据库.但这样就会产生多个用户程序并 发存取同一数据的情况,为了避免破坏一致性,所以必须提供并 ...

  5. QTableView 控件的简单使用

    QTableView类提供了一个表视图的默认模型/视图实现. 一个QTableView实现一个表视图,它显示来自一个模型的项目.这个类用于提供以前由QTable类提供的标准表,但是使用Qt的模型/视图 ...

  6. TemplateMethodPattern(模板方法模式)-----Java/.Net

    一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式

  7. 1070 结绳 (25 分)C语言

    给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下图所示套接在一起.这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连.每次串连后,原来两段绳子的长度 ...

  8. 使用百度NLP接口对搜狐新闻做分类

    一.简介 本文主要是要利用百度提供的NLP接口对搜狐的新闻做分类,百度对NLP接口有提供免费的额度可以拿来练习,主要是利用了NLP里面有个文章分类的功能,可以顺便测试看看百度NLP分类做的准不准.详细 ...

  9. Go指针,如此轻松掌握,希望有收获

    开篇语 依稀记得大学必修课,C语言中的指针,简直是噩梦,指来指去,有没有晕乎乎的感觉,我在想是不是也因为如此,所以Java语言的开发者C才比C语言的多,Java正因为解决了C的痛点,所以今天才能变成语 ...

  10. mongodb的文本搜索

    1.当mongodb进程文本搜索的时候, 一个collection,只有一个文本查询的索引. 2.全文索引的定义,搜索的是有意义的词,不是字母 一开始是简单的用中文姓名的姓,如:张,来查询,但是无效, ...