NSObject是一切OC类的基类,所以我们必须对NSObject所有的方法有一个清楚的认识。

+ (void)load;

当类或者分类被加入到runtime时,load方法会被调用,也就是说在main循环开始前load方法就已经被调用。

(当类被加载到进程的address space时,runtime就会给每个类发送load消息。For classes that are in a shared (dynamically-loaded) library, the runtime sends the load message just after the shared library is loaded into the process's address space.)

由于我们不能确定类加载到runtime中的时间,所以我们要避免在load方法中调用其他oc类。

注意:

  • 类的load方法,是在父类的load方法之后调用的
  • 分类的load方法,是在类的load方法之后调用的
  • 测试发现,只要类被加载到complie source中,即使没使用它,该类一样会被加载到runtime中
  • 在load中创建的对象在main循环之前,它们并没被假如到AutoreleasePool中,需要自己手动来处理

+ (void)initialize;

当类,或者任何继承资它的类,在发送第一个消息之前,runtime会发送initialize消息给该类

  • 父类先收到initialize消息,子类再收到
  • 如果子类没有实现initialize方法,父类可能收到initialize消息(),可以使用下面的方法来阻止收到多次消息
 + (void)initialize {
if (self == [ClassName self]) {
// ... do the initialization ...
}
}
  • 每个类的initialize只会调用一次
  • initialize是线程安全的,所以尽量在initialize方法中做较少的事

源代码分析:

运行时在调用_class_lookupMethodAndLoadCache时,会先调用void _class_initialize(Class cls),查找oc的源代码(http://opensource.apple.com/source/objc4/objc4-646/runtime/objc-initialize.mm),实际上会先递归调用父类的_class_initialize方法,调用成功后,在调用((void(*)(Class, SEL))objc_msgSend)(cls, SEL_initialize),即调用自己的initialize方法。

总结来说:如果A:B:C:NSObject,当对A第一次调用方法时,会先调用B的initialize方法,在调用A的initialize方法。

load and initialize的更多相关文章

  1. load和initialize方法

      一.load 方法什么时候调用: 在main方法还没执行的时候 就会 加载所有类,调用所有类的load方法. load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法. 在项目中使 ...

  2. OC load与initialize

    OC load与initialize load 当类被引用进程序的时候会执行这个函数 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. Category的loa ...

  3. load与initialize

    NSObject类有两种初始化方式load和initialize load + (void)load; 对于加入运行期系统的类及分类,必定会调用此方法,且仅调用一次. iOS会在应用程序启动的时候调用 ...

  4. Objective C类方法load和initialize的区别

    Objective C类方法load和initialize的区别   过去两个星期里,为了完成一个工作,接触到了NSObject中非常特别的两个类方法(Class Method).它们的特别之处,在于 ...

  5. NSObject的load和initialize方法(转)

    全文转载自:http://www.cocoachina.com/ios/20150104/10826.html 在Objective-C中,NSObject是根类,而NSObject.h的头文件中前两 ...

  6. load 与initialize的调用顺序小结

    开发中实用方法固然是最贴近应用的,当一些程序原理还是要先搞清晰,根据查找的一些资料,总结了一些load与initialize的调用. APP启动到执行main函数之前,程序就执行了很多代码   执行顺 ...

  7. 细说OC中的load和initialize方法

    OC中有两个特殊的类方法,分别是load和initialize.本文总结一下这两个方法的区别于联系.使用场景和注意事项.Demo可以在我的Github上找到--load和initialize,如果觉得 ...

  8. load vs. initialize

    这篇文章来对比一下NSObject类的两个方法,+load与+initialize. + (void)load; Invoked whenever a class or category is add ...

  9. iOS load和initialize的区别

    可能有些还不清楚load和initialize的区别,下面简单说一下: 首先说一下 + initialize 方法:苹果官方对这个方法有这样的一段描述:这个方法会在 第一次初始化这个类之前 被调用,我 ...

  10. +(void)load; +(void)initialize;有什么用处?

    总得来说: 1.+load方法是在main函数之前调用的: 2.遵从先父类后子类,先本类后列类别的顺序调用: 3.类,父类与分类之间的调用是互不影响的.子类中不需要调用super方法,也不会调用父类的 ...

随机推荐

  1. SVN代码的回滚二

    SVN代码的回滚: 不丢失新建的文件,获得最新的SVN版本控制.TortoiseSVN-ShowLog-选中你要回滚的版本-右键-Export,之后将修改的文件覆盖到你的最新版本,commit即可. ...

  2. java 14-11 对象数组

    有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. 创建学生类: 学生:Student 成员变量:name,age 构造方法:无参,带参 成员方法:getXxx()/ ...

  3. java10-1 Object类

    Object:类      Object 是类层次结构的根类.每个类都使用 Object 作为超类. 每个类都直接或者间接的继承自Object类. Object类的方法: public int has ...

  4. jenkins忘记管理员登陆密码的补救措施

    jenkins可以作为我们日常运维过程中代码上线的发版平台,所以对jenkins的安全可靠的维护是十分重要的. 1)在登陆jenkins的时候,如果忘记普通用户的登陆密码,只要能用管理员账号登陆,还可 ...

  5. Saltstack-初体验

    安装 rpm -Uvh http://mirrors.yun-idc.com/epel/6Server/x86_64/epel-release-6-8.noarch.rpm yum install s ...

  6. Netty关闭客户端

    在启动客户端的时候,我们一般会 channelFuture.channel().closeFuture().sync(); 这是一段阻塞的代码,除非链路断了,否则是不会终止的,我们可以在handler ...

  7. 浅谈WebService返回数据效率对比

    原文链接 http://www.dotnetgeek.cn/xuexiwebservice1.html 一.什么是WebService: 简单通俗来说,就是企业之间.网站之间通过Internet来访问 ...

  8. 未能解析此远程名称:'nuget.org' 的解决方法

    今天用Nuget下一个程序包时,发现Nuget挂了: 未能解析此远程名称:'nuget.org' . 浏览器打开  http://nuget.org  失败. 使用cmd命令 输入nslookup n ...

  9. C语言 百炼成钢18

    //题目52:用递归打印以下图形 //* //*.*. //*..*..*.. //*...*...*...*... //*....*....*....*....*.... #include<s ...

  10. string与stringBuilder的效率与内存占用实测

    using UnityEngine; using System.Diagnostics; using System.Text; using UnityEngine.UI; public class s ...