Objective-C——initialize方法调用原理分析
生活随笔
收集整理的這篇文章主要介紹了
Objective-C——initialize方法调用原理分析
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一、調(diào)用時(shí)機(jī)
在類第一次接收到消息的時(shí)候調(diào)用
二、調(diào)用順序
- 先調(diào)用父類的initialize方法,再調(diào)用子類的initialize方法(遞歸,每個(gè)類只會(huì)初始化一次)
- 如果子類沒有實(shí)現(xiàn)initialize方法,則會(huì)調(diào)用父類的initialize方法(消息調(diào)用機(jī)制,通過superclass指針向上查找)(所以,父類的initialize方法可能會(huì)被調(diào)用多次)
- 如果分類實(shí)現(xiàn)了initialize方法,會(huì)“覆蓋”類本身的initialize調(diào)用(方法合并的時(shí)候,分類的方法更靠前)
三、源碼窺探
// objc-initialize.mm /*********************************************************************** * class_initialize. Send the '+initialize' message on demand to any * uninitialized class. Force initialization of superclasses first. **********************************************************************/ void initializeNonMetaClass(Class cls) {ASSERT(!cls->isMetaClass());Class supercls;bool reallyInitialize = NO;// Make sure super is done initializing BEFORE beginning to initialize cls.// See note about deadlock above.supercls = cls->superclass;// 如果有父類,并且父類沒有完成初始化if (supercls && !supercls->isInitialized()) {// 遞歸初始化父類initializeNonMetaClass(supercls);}// 如果類沒有完成初始化,并且不是正在初始化,標(biāo)記成準(zhǔn)備初始化if (!cls->isInitialized() && !cls->isInitializing()) {cls->setInitializing();reallyInitialize = YES;}if (reallyInitialize) {// 發(fā)送initialize消息:// ((void(*)(Class, SEL))objc_msgSend)(cls, @selector(initialize));callInitialize(cls);// Done initializing./*// lockAndFinishInitializing 主要做了兩件事:// 標(biāo)記完成初始化cls->setInitialized();// 釋放鎖classInitLock.notifyAll();*/lockAndFinishInitializing(cls, supercls); } }四、示例分析(一)
1. 結(jié)構(gòu)圖(均實(shí)現(xiàn)了initialize方法)
2. 代碼
①:[Person class]; ②:[Student class]; ③:[GoodStudent class]; ④:[NorStudent class]; /// 調(diào)用結(jié)果 +[Person initialize] +[Student initialize] +[GoodStudent initialize] +[NorStudent initialize]3. 分析
- 執(zhí)行代碼①,給Person發(fā)消息,Person的父類NBObjcet沒有實(shí)現(xiàn)initialize方法,所以調(diào)用父類的方法,不會(huì)有打印信息,接著調(diào)用Person類中的initialize方法,打印+[Person initialize]
- 執(zhí)行代碼②,給Student發(fā)消息,先看父類Person是否初始化,因?yàn)楦割愐呀?jīng)初始化,所以調(diào)用Student類的initialize方法,打印+[Student initialize]
- 執(zhí)行代碼③,給GoodStudent發(fā)消息,先看父類Student是否初始化,代碼執(zhí)行邏輯同上
- 執(zhí)行代碼④,給NorStudent發(fā)消息,代碼執(zhí)行邏輯同上
4. 總結(jié)
五、實(shí)例分析(二)
1. 結(jié)構(gòu)圖(部分實(shí)現(xiàn)了initialize方法)
2. 代碼
①:[Person class]; ②:[Student class]; ③:[GoodStudent class]; ④:[NorStudent class]; /// 調(diào)用結(jié)果 +[Person initialize] +[Student initialize] +[Student initialize] +[NorStudent initialize]3. 分析
-
代碼①、②的執(zhí)行邏輯同上
-
執(zhí)行代碼③的邏輯如下圖:
所以,Student的initialize方法會(huì)執(zhí)行兩次。
4. 總結(jié)
總結(jié)
以上是生活随笔為你收集整理的Objective-C——initialize方法调用原理分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mono 的创建
- 下一篇: 织梦模板被植入index.html,织梦