一、load

方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法。

load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法。

在项目中使用的一些场景:

比如我们要统计所有页面(UIViewController、UITableViewController)的数据,可以在UIViewController的类别里的load方法里实现Method Swizzle

@implementation UIViewController (BaseMethod)

+ (void)load {
        Method originalViewDidLoad = class_getInstanceMethod([self class], @selector(viewDidLoad));
        Method swizzledViewDidLoad = class_getInstanceMethod([self class], @selector(swizzled_viewDidLoad));
        method_exchangeImplementations(originalViewDidLoad, swizzledViewDidLoad);
}

再比如AFNetworking中的_AFURLSessionTaskSwizzling类重写了load方法,并且在其中调用了swizzleResumeAndSuspendMethodForClass:来进行method swizzling。有兴趣的可以去看下源代码。

二、initialize

初始化对象的时候会调用initialize方法,initialize方法这块用来分配内存,init方法是创建对象。

具体到语法,就是 调用 alloc 方法的时候 会去执行initialize。

比如:  Bird *birdAlloc = [Bird alloc];  这句就会执行Bird类的initialize方法。

Bird *bird = [birdAlloc init];  这句会执行Bird的init方法。

initialize方法一般用于初始化全局变量或静态变量,也可以进行通知的处理。

在项目中的例子:

比如下面SBJson源代码中的代码,NSCharacterSet、NSMutableArray等无法在编译期初始化,可以放到initialize中进行赋值。

1 static NSCharacterSet *kDecimalDigitCharacterSet;
2
3 @implementation SBJsonTokeniser
4
5 + (void)initialize {
6     kDecimalDigitCharacterSet = [NSCharacterSet decimalDigitCharacterSet];
7 }

initialize内部也使用了锁,所以是线程安全的。但同时要避免阻塞线程,不要再使用锁。

与load方法类似的是,在initialize方法内部也会调用父类的方法,而且不需要我们显示的写出来。与load方法不同之处在于,即使子类没有实现initialize方法,也会调用父类的方法。

如果我们只需要父类的initialize方法只执行一次,可以这样写:

1 + (void)initialize {
2     if (self == [Bird class]) {
3         NSLog(@"%s %@", __func__, [self class]);
4     }
5 }

我们在init方法中会调用[super init],但load、initialize方法不需要我们调用super方法,调用super方法是多余的。

因为runtime会自动对父类load方法进行调用,而initialize则会随子类自动激发父类的方法,不需要显示调用。另一方面,如果父类中的方法用到的self(像示例中的方法),其指代的依然是类自身,而不是父类。

其他人总结的一个表格:

  +(void)load +(void)initialize
执行时机 在程序运行后立即执行 在类的方法第一次被调时执行
若自身未定义,是否沿用父类的方法?
类别中的定义 全都执行,但后于类中的方法 覆盖类中的方法,只执行一个

文章中涉及的代码放到 github 上了

load和initialize方法的更多相关文章

  1. NSObject的load和initialize方法(转)

    全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两 ...

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

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

  3. +load和+initialize方法调用时机

    一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中 ...

  4. +Load和+initialize方法解析

    http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html

  5. oc---类方法load和initialize的区别

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

  6. load与initialize

    NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...

  7. iOS load和initialize的区别

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

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

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

  9. 解读OC中的load和initialize

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

随机推荐

  1. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  2. HTML 事件(二) 事件的注册与注销

    本篇主要介绍HTML元素事件的注册.注销的方式. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流.事件委托 4. ...

  3. 开源一个跨平台运行的服务插件 - TaskCore.MainForm

    本次将要很大家分享的是一个跨平台运行的服务插件 - TaskCore.MainForm,此框架是使用.netcore来写的,现在netcore已经支持很多系统平台运行了,所以将以前的Task.Main ...

  4. C#中如何给Excel添加水印

    我们知道Microsoft Excel并没有内置的功能直接给Excel表添加水印,但是其实我们可以用其他变通的方式来解决此问题,如通过添加页眉图片或艺术字的方法来模仿水印的外观.所以在这篇文章中,我将 ...

  5. Servlet监听器笔记总结

    监听器Listener的概念 监听器的概念很好理解,顾名思义,就是监视目标动作或状态的变化,目标一旦状态发生变化或者有动作,则立马做出反应. Servlet中的也有实现监听器的机制,就是Listene ...

  6. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  7. ASP.NET MVC一次删除多笔记录

    批量删除数据记录,如下面的截屏: 先选中想删除的记录,然后点一下删除铵钮,系统将把选中的记录一次性删除.在此,Insus.NET不想每删除一笔记录连接一次数据库. 因此需要把选择的记录一次上传至服务器 ...

  8. 【夯实PHP基础】PHP数组,字符串,对象等基础面面观

    本文地址 分享提纲 1.数组篇 2.字符创篇 3.函数篇 4.面向对象篇 5.其他篇 /*************************** 一.数组篇 Begin***************** ...

  9. SVN的使用

  10. github中的watch、star、fork的作用

    [转自:http://www.jianshu.com/p/6c366b53ea41] 在每个 github 项目的右上角,都有三个按钮,分别是 watch.star.fork,但是有些刚开始使用 gi ...