initialize方法

本文探讨了Objective-C中+initialize方法的调用时机,它会在类第一次接收到消息时执行。通过objc_msgSend函数实现,如果子类未实现,则会调用父类的+initialize,分类的实现会覆盖类本身的+initialize。调用顺序遵循先父类后子类的原则,每个类仅初始化一次。这是李明杰老师iOS底层原理课程的学习笔记。
摘要由CSDN通过智能技术生成

1、+ initialize方法会在类第一次接受到消息时调用

2、+initialize方法是通过objc_msgSend函数(消息发送机制)调用

2.1、如果子类没有实现+initialize,会调用父类的+initialize(所以父类的+initialize可能会被调用多次)
2.2、如果分类实现了+initialize,会覆盖类本身的+initialize的调用

调用顺序

1、先调用父类的+initialize方法,再调用子类的+initialize方法(如果有实现+initialize时) — 先初始化父类,再初始化子类,每个类只会初始化一次
2、遵循消息发送机制的方法查找顺序
============================== 源码解读顺序 ==============================
/*
	1、lookUpImpOrForward
	2、initializeAndLeaveLocked
	3、initializeAndMaybeRelock
	4、initializeNonMetaClass
	5、callInitialize
	6、objc_msgSend
*/
============================== 核心代码查看 ==============================
//	内部也是调用 class_getInstanceMethod方法
Method class_getClassMethod(Class cls, SEL sel)
{
   
    if (!cls  ||  !sel) return nil;
    return class_getInstanceMethod(cls->getMeta(), sel);
}

/*
	class_getInstanceMethod方法的实现
	接下来查看 lookUpImpOrForward方法的实现
*/	
Method class_getInstanceMethod(Class cls, SEL sel)
{
   
    if (!cls  ||  !sel) return nil;
#warning fixme build and search caches
    // Search method lists, try method resolver, etc.
    lookUpImpOrForward(nil, sel, cls, LOOKUP_RESOLVER);
#warning fixme build and search caches
    return 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值