一、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. Socket聊天程序——Common

    写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...

  2. CSS 选择器及各样式引用方式

    Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...

  3. ExtJS 4.2 业务开发(一)主页搭建

    本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...

  4. Matlab slice方法和包络法绘制三维立体图

    前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...

  5. 如何在网页中提取Email地址

    开博好久了,今天第一次发表技术文档,之前总是将一些好的事例保存在电脑,时间久了找起来也很麻烦,所以还是放在博客里进行归类比较方便,这样也能将自己在学习过程中的一些心得体会分享给大家,也能给需要的人一点 ...

  6. warensoft unity3d 更新说明

    warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...

  7. DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)

    上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...

  8. ThinkPHP 模板substr的截取字符串函数

    ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...

  9. H3 BPM产品安装手册(.Net版本)

    1         安装说明 1.1    服务器安装必备软件 在使用该工作流软件之前,有以下一些软件是必须安装: l  IIS7.0以上版本(必须): l  .Net Framework 4.5(必 ...

  10. Linux常用命令

    命令格式与目录处理命令 ls 命令格式与目录处理命令 ls 命令格式:命令 [-选项][参数] 例:ls -la /etc 说明: 1)个别命令使用不遵循格式 2)当有多个选项时,可以写在一起 3)简 ...