一、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. Hadoop 中利用 mapreduce 读写 mysql 数据

    Hadoop 中利用 mapreduce 读写 mysql 数据   有时候我们在项目中会遇到输入结果集很大,但是输出结果很小,比如一些 pv.uv 数据,然后为了实时查询的需求,或者一些 OLAP ...

  2. 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新

    [原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...

  3. .NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. CGI与FastCGI nginx+PHP-FPM

    本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...

  6. PHP之时间和日期函数

    // 时间日期函数 Time <?php date_default_timezone_set('UTC'); // 获取当前时间的时间戳 $time0 = mktime(); $time1 = ...

  7. CSS样式重置(转)

    body,h1,h2,h3,h4,h5,h6,dl,dt,dd,ul,ol,li,th,td,p,blockquote,pre,form,fieldset,legend,input,button,te ...

  8. angularjs 依赖注入--自己学着实现

    在用angular依赖注入时,感觉很好用,他的出现是 为了"削减计算机程序的耦合问题" ,我怀着敬畏与好奇的心情,轻轻的走进了angular源码,看看他到底是怎么实现的,我也想写个 ...

  9. Solr高级查询Facet

    一.什么是facet solr种以导航为目的的查询结果成为facet,在用户查询的结果上根据分类增加了count信息,然后用户根据count信息做进一步搜索. facet主要用于导航实现渐进式精确搜索 ...

  10. Android MVP+Retrofit+RxJava实践小结

    关于MVP.Retrofit.RxJava,之前已经分别做了分享,如果您还没有阅读过,可以猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava ...