[IOS] initialize VS load 大战 3k回合。。

这几天又仔细看了下公司的SDK,对之前用的 load 、initialize 又模糊起来了,然后就。。。

YY之后还是要干点活搞点正事呀 ~  T_T ~

+(void)initialize 、+(void)load 是NSObject 的两个类方法, NSObject 又作为强大的 root 类,

为其他类提供了一系列的生命周期、线程、内省、运行时、归档等方法. 作为 Root 类也已经

很能干了。

那有啥区别,又该怎么用呢?

1、load 是只要类所在文件被引用就会被调用,而 initialize 是在类或者其子类的第一个方法被调用前调用。

所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么

initialize 也不会被调用。废话有点多。。

2、+initialize 只会被调用一次,Category中的+initialize方法会覆盖类本身的+initialize方法,而在Category

中+load方法却不会覆盖本身类中的+load 方法。如果父类中实现了+initialize方法,而子类中没有重写此

方法,则子类初始化时就会使用父类的方法([super initialize]).当然你不想调用父类的初始化方法,也

可以重写,代码如下

+ (void)initialize {
  if (self == [ClassName self]) {
    // ... do the initialization ...
  }
}

3. 使用场景

将针对于类修改放在intialize中,将针对Category的修改放在load中。

官方解释:

验证代码及分析详见:http://wufawei.com/2013/06/load-initialize/

如果你感觉上面的说的还简单的话,就看看这篇吧

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

若上一篇看的眼花缭乱,英文还可以就看下老外写的这篇吧

https://mikeash.com/pyblog/friday-qa-2009-05-22-objective-c-class-loading-and-initialization.html

时间: 2024-07-30 20:26:45

[IOS] initialize VS load 大战 3k回合。。的相关文章

iOS - + initialize 与 +load

Objective-C 有两个神奇的方法:+load 和 +initialize,这两个方法在类被使用时会自动调用.但是两个方法的不同点会导致应用层面上性能的显著差异. 一.+ initialize 方法和+load 调用时机 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + loa

iOS-方法之+ initialize 与 +load(转载)

Objective-C 有两个神奇的方法:+load 和 +initialize,这两个方法在类被使用时会自动调用.但是两个方法的不同点会导致应用层面上性能的显著差异. 一.+ initialize 方法和+load 调用时机 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量. load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + loa

Objective-C中的+initialize和+load

写在前面 近几天花了一些时间了解了一下Objective-C runtime相关的东西,其中涉及到了+load方法,譬如method swizzling通常在category的+load方法中完成.之前对initializer和load的使用就比较疑惑,但一直没有详细去对比了解,以此为契机,集各方资源,分析一下吧! 关于了解+initialize和+load,个人感觉参考官方文档<NSObject Class Reference>就够了. +initialize 关于+initialize方法

iOS培训笔记--load,initialize方法

+(void)load:在程序启动时就会调用一次该方法特点:先调用父类,再调用子类,再调用分类(编译的时候加载顺序:父类->子类->分类),分类中的load不会覆盖主类中的load +(void)initialize:在类被头一次使用时会调用该方法特点:先调用父类中的initialize,再调用子类中的initialize

iOS中的initialize与load两个类方法简单理解

如果你在一个UIViewController中重写了这两个类方法,那么你会在在这个控制器中发现一下现象: 1,相同之处: (1)这两个类方法在init之前就调用了 (2)在整个应用app中无论你用到这个类多少次,这两个类方法均只会被调用一次 2,不同之处: (1)load是在initialize之前被调用 (2)更特别的是,如果你没有用到你重写的这个控制器.那你重写的load类方法也会调用.换句话说,这个load方法是在didFinishLaunchingWithOptions方法之前就被调用了

initialize和load

/**load  *  当类加载到OC运行环境中(内存),就会调用一次  */ /**initialize  *  当第一次使用这个类的时候才会调用  */ #import "Person.h" @implementation Person + (void)load {     NSLog(@"------------person load--------------"); } + (void)initialize {     NSLog(@"------

ios initialize和init等方法

在程序运行过程中,创建多个类对象,只会调用一次initialize.而创建几个类对象就会调用几次init; 创建一个类aa,分别重写 initialize和init方法 #import "aa.h" @implementation aa + (void)initialize{ NSLog(@"%s",__func__); } - (instancetype)init{ self = [super init]; if (self) { NSLog(@"%s&

解决IOS could not load NIB in bundler

就在刚刚IOS运行的时候出现一个问题,就是在TableViewController中加载TableViewCell时不能加载nib文件. 然后就百度了一下,大部分说是loadNibNamed:@"nib名字" 时nib名字写错了,当然这也是一个问题, 但是我的问题不是这个引起的. 项目需要协同开发,同事提交个文件我更新了一下后,在Targets下的build phases中Copy Bundle Resources里面没有将nib文件加进来,把nib文件加进来后问题解决,项目运行流畅.

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS