06. 03 +initialize方法

  • initialize的调用:
  • 通过runtime的消息发送机制来调用
  • 调用子类的initialize之前,会先调用父类的initialize.
  • 会在类第一次收到消息的时候调用,如果这个类不被调用,那么就永远不会调用initialize.
  • 如果子类没有实现+initialize,会调用父类+initialize(所以父类的+initialize可能会被调用多次)
  • 如果分类实现了+initialize,就覆盖类本身的+initialize调用(因为走的是objc_msgSend)

1. +initialize

在这里插入图片描述

1. initializeNonMetaClass

在这里插入图片描述
递归找到子类的父类


  • callInitialize
    在这里插入图片描述

2. 面试题

1. +load , + initalize方法的区别是什么?
  1. 调用方式

load是根据函数地址直接调用
initalize是通过objc_msgSend调用

  1. 调用时刻

load是runtime加载类,分类的时候调用(只会调用一次)
initalize是类第一次接受到消息的时候调用,每一个类只会initalize一次(如果子类没有实现+initalize方法,那么会调用父类的initalize方法,所以父类initalize会被调用多次)

2. load,initalize的调用方法

load

  1. 先调用类的load
  1. 先编译的类,优先调用load
  2. 调用子类的load之前,会先调用父类的load
  1. 再调用分类的load
  1. 先编译的分类,优先调用load
  1. initalize
  1. 先初始化父类
  2. 再初始化子类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值