load和initialize方法
一、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方法的更多相关文章
- NSObject的load和initialize方法(转)
全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两 ...
- 细说OC中的load和initialize方法
OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...
- +load和+initialize方法调用时机
一.+load方法什么时候调用 +load方法会在runtime加载类.分类时调用(程序运行起来会先去加载调用+load 跟你引用没有引用其头文件没有关系).每个类.分类的+load,在程序运行过程中 ...
- +Load和+initialize方法解析
http://www.cnblogs.com/ider/archive/2012/09/29/objective_c_load_vs_initialize.html
- oc---类方法load和initialize的区别
在iOS开发中,就像Application有生命周期回调方法一样,在Objective-C的类被加载和初始化的时候,也可以收到方法回调,可以在适当的情况下做一些定制处理.而这正是本篇文章所要介绍的lo ...
- load与initialize
NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...
- iOS load和initialize的区别
可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我 ...
- iOS---Objective-C: +load vs +initialize
在 NSObject 类中有两个非常特殊的类方法 +load 和 +initialize ,用于类的初始化.这两个看似非常简单的类方法在许多方面会让人感到困惑,比如: 子类.父类.分类中的相应方法什么 ...
- 解读OC中的load和initialize
在 Objective-C 中,NSObject 是绝大多数类的基类.而在 NSObject 中有两个类方法 load 和 initialize,那这两个方法是在什么时机被调用呢?父类.Categor ...
随机推荐
- Socket聊天程序——Common
写在前面: 上一篇记录了Socket聊天程序的客户端设计,为了记录的完整性,这里还是将Socket聊天的最后一个模块--Common模块记录一下.Common的设计如下: 功能说明: Common模块 ...
- CSS 选择器及各样式引用方式
Css :层叠样式表 (Cascading Style Sheets),定义了如何显示HTML元素. 目录 1. 选择器的分类:介绍ID.class.元素名称.符合.层次.伪类.属性选择器. 2. 样 ...
- ExtJS 4.2 业务开发(一)主页搭建
本篇开始搭建一个ExtJS 4.2单页面应用, 这里先介绍主页的搭建,内容包括:主页结构说明.扩展功能等方面. 目录 1. 主页结构说明 2. 扩展功能 3. 在线演示 1. 主页结构说明 1.1 主 ...
- Matlab slice方法和包络法绘制三维立体图
前言:在地球物理勘探,流体空间分布等多种场景中,定位空间点P(x,y,x)的物理属性值Q,并绘制三维空间分布图,对我们洞察空间场景有十分重要的意义. 1. 三维立体图的基本要件: 全空间网格化 网格节 ...
- 如何在网页中提取Email地址
开博好久了,今天第一次发表技术文档,之前总是将一些好的事例保存在电脑,时间久了找起来也很麻烦,所以还是放在博客里进行归类比较方便,这样也能将自己在学习过程中的一些心得体会分享给大家,也能给需要的人一点 ...
- warensoft unity3d 更新说明
warensoft unity3d 组件的Alpha版本已经发布了将近一年,很多网友发送了改进的Email,感谢大家的支持. Warensoft Unity3D组件将继续更新,将改进的功能如下: 1. ...
- DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践(3)
上一篇:<DDD 领域驱动设计-谈谈 Repository.IUnitOfWork 和 IDbContext 的实践(2)> 这篇文章主要是对 DDD.Sample 框架增加 Transa ...
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
- H3 BPM产品安装手册(.Net版本)
1 安装说明 1.1 服务器安装必备软件 在使用该工作流软件之前,有以下一些软件是必须安装: l IIS7.0以上版本(必须): l .Net Framework 4.5(必 ...
- Linux常用命令
命令格式与目录处理命令 ls 命令格式与目录处理命令 ls 命令格式:命令 [-选项][参数] 例:ls -la /etc 说明: 1)个别命令使用不遵循格式 2)当有多个选项时,可以写在一起 3)简 ...