一、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. C# DateTime与时间戳转换

    C# DateTime与时间戳的相互转换,包括JavaScript时间戳和Unix的时间戳. 1. 什么是时间戳 首先要清楚JavaScript与Unix的时间戳的区别: JavaScript时间戳: ...

  2. ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求

    通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...

  3. ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之目录导航

    ASP.NET MVC with Entity Framework and CSS是2016年出版的一本比较新的.关于ASP.NET MVC.EF以及CSS技术的图书,我将尝试着翻译本书以供日后查阅. ...

  4. PHP获取客户端IP

    /** * 获取客户端IP */ function getClientIp() { $ip = 'unknown'; $unknown = 'unknown'; if (isset($_SERVER[ ...

  5. 《LoadRunner12七天速成宝典》签售会2016-12-17北京

    报名地址: http://www.after615.com/actives/s?id=3141&time=1480042829608&sign=9ac8e25e9ab3cf57f613 ...

  6. ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知

    一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...

  7. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  8. ABP领域层

    1.实体Entites 1.1 概念 实体是DDD(领域驱动设计)的核心概念之一. 实体是具有唯一标识的ID且存储在数据库总.实体通常被映射成数据库中的一个表. 在ABP中,实体继承自Entity类. ...

  9. 解决:win10_x64 VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation

    bcdedit /set hypervisorlaunchtype off A reboot of of the Windows OS is necessary  必须重启才能生效   To enab ...

  10. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...