版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
目錄CONTENTS01NSObject02Class內(nèi)部成員03消息轉(zhuǎn)發(fā)04自省和消息替換05使用場(chǎng)景01NSObject什么是Runtime?iOS基于消息機(jī)制iOS運(yùn)行時(shí)才決定要調(diào)用哪個(gè)方法〔動(dòng)態(tài)調(diào)用〕Runtime是一個(gè)開(kāi)源庫(kù)NSObjectNSObject有一局部在Runtime庫(kù)實(shí)現(xiàn)weakAutoreleasePool02Class內(nèi)部結(jié)構(gòu)Class的內(nèi)部結(jié)構(gòu):內(nèi)部成員Class是一個(gè)指向objc_class的結(jié)構(gòu)體指針——所以Class也是一種對(duì)象Class的內(nèi)部結(jié)構(gòu):內(nèi)部成員在Runtime中的定義MetaClass
Class的內(nèi)部結(jié)構(gòu):內(nèi)部成員類的isa成員objc_allocateClassPair:創(chuàng)立一個(gè)類以及MetaClassClass的內(nèi)部結(jié)構(gòu):內(nèi)部成員方法鏈表和方法緩存參數(shù)列表協(xié)議列表Class的內(nèi)部結(jié)構(gòu):IvarIvar表示類中的實(shí)例變量定義:Ivar是一個(gè)指向objc_ivar的結(jié)構(gòu)體指針,包括了變量名稱〔ivar_name〕、變量類型〔ivar_type〕等信息Class的內(nèi)部結(jié)構(gòu):MetaClassClass和MetaClass關(guān)系圖Class的內(nèi)部結(jié)構(gòu):SELSEL定義:SEL是一個(gè)指向objc_selector的結(jié)構(gòu)體指針,表示方法的簽名不同的類,可以擁有同一個(gè)SELClass的內(nèi)部結(jié)構(gòu):MethodMethod定義:Class中定義的methodList,保存的就是Method對(duì)象的集合performSelector又是什么鬼?運(yùn)行時(shí)負(fù)責(zé)查找方法,編譯時(shí)不做任何校驗(yàn)使用respondsToSelector預(yù)判方法是否存在performSelector語(yǔ)法同步,線程無(wú)關(guān)異步,僅限于主線程在主線程和子線程都可以執(zhí)行performSelector語(yǔ)法調(diào)用指定線程中的某個(gè)方法開(kāi)啟子線程在后臺(tái)運(yùn)行Class的內(nèi)部結(jié)構(gòu):IMPIMP是implementation的縮寫,定義如下:任何繼承自NSObject的類對(duì)象,都可以使用id來(lái)替代,因?yàn)閕d本身是一個(gè)指向objc_object類型的結(jié)構(gòu)體指針Class的內(nèi)部結(jié)構(gòu):IMPIMP是一個(gè)函數(shù)指針〔方法實(shí)現(xiàn)地址〕IMP包括以下參數(shù):id:一個(gè)接收消息的對(duì)象SEL:要調(diào)用的方法不定個(gè)數(shù)的方法參數(shù),可選,從0到,與OC對(duì)應(yīng)的方法參數(shù)一致Block也是一種IMPClass的內(nèi)部結(jié)構(gòu):objc_msgSend
定義:iOS在執(zhí)行任何方法時(shí)都會(huì)將其轉(zhuǎn)到這個(gè)函數(shù)也具有和IMP一樣的參數(shù)Class的內(nèi)部結(jié)構(gòu):objc_msgSend
Student*小明=[[Studentalloc]init];[小明談戀愛(ài)];[小明抄作業(yè)(@”物理”)];調(diào)用Student類中的“談戀愛(ài)”方法,就是在Student類的方法鏈表中查找名為“談戀愛(ài)”的SEL所對(duì)應(yīng)的IMP〔方法實(shí)現(xiàn)地址〕,找到了就執(zhí)行,找不到再想別的方法。上述這些動(dòng)作是由objc_msgSend函數(shù)來(lái)完成的,是iOS系統(tǒng)在執(zhí)行[小明談戀愛(ài)];這個(gè)方法時(shí),將其自動(dòng)轉(zhuǎn)到objc_msgSend函數(shù)的。Class的內(nèi)部結(jié)構(gòu):方法緩存objc_msgSend函數(shù)每次都要在類的方法列表中根據(jù)SEL去查找IMP為了提高查找速度,設(shè)計(jì)出方法緩存如果當(dāng)前類的方法緩存和鏈表中都找不到,就去它的父類尋找,找到那么參加當(dāng)前類的緩存中03消息轉(zhuǎn)發(fā)消息轉(zhuǎn)發(fā)如果objc_msgSend找不到怎么辦? -->拋出unrecognizedselectorsenttoxxx異常補(bǔ)救措施〔按順序執(zhí)行〕:MethodResolutionFastForwardingNormalForwarding消息轉(zhuǎn)發(fā):流程圖消息轉(zhuǎn)發(fā):消息轉(zhuǎn)發(fā)之MethodResolution
在要調(diào)用的方法所在的類增加resolveInstanceMethod方法,讓別的方法去處理:
消息轉(zhuǎn)發(fā):消息轉(zhuǎn)發(fā)之FastForwarding在要調(diào)用的方法所在的類增加forwardingTargetForSelector方法,移花接木,讓別的類去處理:
消息轉(zhuǎn)發(fā):消息轉(zhuǎn)發(fā)之NormalForwarding在要調(diào)用的方法所在的類增加forwardInvocation和methodSignatureForSelector方法,移花接木,讓別的類去處理:
三種轉(zhuǎn)發(fā)機(jī)制的比較MethodResolution:在自己及父類中尋找FastForwarding:在別的類尋找NormalForwarding:與消息相關(guān)的所有信息都封裝在NSInvocation對(duì)象中,包括SEL、方法參數(shù)等NormalForwarding中的
v@:
第一個(gè)參數(shù)v,表示返回類型,v表示void第二個(gè)參數(shù)@,表示id,固定值第三個(gè)參數(shù):,表示SEL,固定值如果還有第4個(gè)甚至更多的字符,那就是代表SEL所對(duì)應(yīng)的方法參數(shù)了,一般都對(duì)應(yīng)@,即NSObject
NormalForwarding中的v@:
符號(hào)代表類型*char*^typetype
*@NSObject
*
或
id^@NSError
**#NSObjectvvoid:SEL消息轉(zhuǎn)發(fā)的最后一步〔第四步〕:doesNotRecognizeSelectordoesNotRecognizeSelector
由系統(tǒng)提供負(fù)責(zé)拋出異常用消息轉(zhuǎn)發(fā)實(shí)現(xiàn)多重繼承在Parent類定義eat方法,但是不實(shí)現(xiàn)在Child類定義并實(shí)現(xiàn)eat方法在Parent類使用forwardingTargetForSelector方法04自省、消息替換和關(guān)聯(lián)對(duì)象概述iOSRuntime=
自省
+
方法替換自?。韩@取信息的函數(shù)方法替換:修改或新增方法的函數(shù)自省〔introspective〕自省是對(duì)象的固有能力,即程序運(yùn)行時(shí),對(duì)象可根據(jù)一些方法,獲取自身的信息,或動(dòng)態(tài)執(zhí)行一些方法我是誰(shuí)?自省〔introspective〕方法名稱作用class返回對(duì)象的類isKindOfClass檢查對(duì)象是否在指定的類繼承體系中isMemberOfClass檢查對(duì)象是否在指定的類繼承體系中respondsoSelector檢查對(duì)象能否相應(yīng)指定的消息conformsToProtocol檢查對(duì)象是否實(shí)現(xiàn)了指定協(xié)議類的方法methodForSelector返回指定方法實(shí)現(xiàn)的地址performSelector:withObject執(zhí)行SEL所指代的方法NSObject提供的自省方法:自省〔introspective〕object_getClass和object_getClassName:
取得任意一個(gè)對(duì)象的類和類名
多用于判斷類型
自省〔introspective〕class_copyPropertyList:獲取類的所有屬性列表,得到一個(gè)數(shù)組property_getName:獲取到某個(gè)屬性的名稱自省〔introspective〕class_copyMethodList:
獲取類的所有方法列表,得到一個(gè)數(shù)組method_getName:
獲取到每個(gè)方法對(duì)應(yīng)的SEL
類似的,關(guān)于獲取Ivar的方法自省〔introspective〕帶有From文字的方法:NSClassFromString:反射可用于導(dǎo)航器
可用于判斷某個(gè)class是否存在NSSelectorFromString:從字符串中反射得到Selector類型:方法替換〔MethodSwizzing〕object_setClass
用于把一個(gè)對(duì)象設(shè)置為一個(gè)新的類型方法替換〔MethodSwizzing〕load和initialize方法用于類的加載和初始化,是一開(kāi)始就執(zhí)行的方法方法替換〔MethodSwizzing〕objc_allocateClassPair 用于動(dòng)態(tài)創(chuàng)立一個(gè)新類 同時(shí)還創(chuàng)立了新類的MetaClass
指定新類繼承自NSObject方法替換〔MethodSwizzing〕class_addMethod
為一個(gè)類增加新的方法
為ClassA新增一個(gè)方法doSomething,指定它的實(shí)現(xiàn)〔IMP〕是newMethod方法替換〔MethodSwizzing〕class_addMethod
為一個(gè)類增加新的方法,帶參數(shù)的實(shí)現(xiàn)
為ClassA新增一個(gè)方法doSomething,指定它的實(shí)現(xiàn)〔IMP〕是newMethod方法替換〔MethodSwizzing〕method_setImplementation
為類的某個(gè)原有方法Method設(shè)置一個(gè)新的IMP實(shí)現(xiàn)
把Person的sayHello方法實(shí)現(xiàn)替換為sayHi方法實(shí)現(xiàn)方法替換〔MethodSwizzing〕class_replaceMethod 把一個(gè)類的某個(gè)方法,替換為另一個(gè)方法是method_setImplementation和class_addMethod這兩種場(chǎng)景的組合1〕舊的方法SELname如果不存在,那其實(shí)就是調(diào)用class_AddMethod方法,這時(shí)候types參數(shù)就是非常有用的了。2〕舊的方法SELname如果存在,那其實(shí)就是調(diào)用method_setImplementation方法方法替換〔MethodSwizzing〕class_replaceMethod的例子:
把Person的sayHello方法實(shí)現(xiàn)替換為sayHi方法實(shí)現(xiàn)方法替換〔MethodSwizzing〕method_exchangeImplementations交換兩個(gè)方法的實(shí)現(xiàn)
關(guān)聯(lián)對(duì)象:為一個(gè)類增加新方法或?qū)傩允褂肅ategory:缺點(diǎn)是不能增加屬性使用關(guān)聯(lián)對(duì)象:把兩個(gè)對(duì)象關(guān)聯(lián)起來(lái)objc_setAssociatedObjectobjc_getAssociatedObjectobjc_removeAssociatedObjects:很少使用分為靜態(tài)和動(dòng)態(tài)兩種方式05使用場(chǎng)景使用場(chǎng)景:AOP面向切面編程日志記錄性能統(tǒng)計(jì)平安控制事務(wù)處理異常處理使用場(chǎng)景:AOPAOP的優(yōu)勢(shì):減少切面業(yè)務(wù)的開(kāi)發(fā)量減少代碼耦合,方便復(fù)用提高代碼review的質(zhì)量使用場(chǎng)景:減少機(jī)械性的if判斷?使用場(chǎng)景:寫日志使用場(chǎng)景:Aspects提供的方法使用場(chǎng)景:Aspects寫入配置文件使用場(chǎng)景:Aspects讀取配置文件使用場(chǎng)景:NSProxyNSProxy也是一個(gè)根類,類似于NSObjectNSProxy是一個(gè)抽象類,實(shí)現(xiàn)了NSObject協(xié)議NSProxy是一種高級(jí)的代理,通過(guò)Runtime的消息轉(zhuǎn)發(fā)機(jī)制代理模式的實(shí)現(xiàn)靜態(tài)代理NSProxy繼承NSProxy-delegate提供消息轉(zhuǎn)發(fā)機(jī)制-methodSignatureForSelec
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版房屋買賣合同中的房屋抵押及解押約定3篇
- 二零二五河南事業(yè)單位100人招聘項(xiàng)目合同執(zhí)行標(biāo)準(zhǔn)3篇
- 二零二五版建筑工程項(xiàng)目現(xiàn)場(chǎng)勘察與監(jiān)測(cè)服務(wù)合同3篇
- 二零二五版混凝土結(jié)構(gòu)防雷接地施工合同2篇
- 二零二五年度草場(chǎng)承包管理與開(kāi)發(fā)合同范本3篇
- 二零二五版國(guó)際貿(mào)易實(shí)務(wù)實(shí)驗(yàn)報(bào)告與國(guó)際貿(mào)易實(shí)務(wù)實(shí)訓(xùn)合同3篇
- 二零二五年度虛擬現(xiàn)實(shí)(VR)技術(shù)研發(fā)合同3篇
- 二零二五年度特種貨物安全運(yùn)輸服務(wù)合同范本2篇
- 二零二五年度體育設(shè)施建設(shè)與運(yùn)營(yíng)管理復(fù)雜多條款合同3篇
- 二零二五年度電梯門套安裝與安全性能檢測(cè)合同3篇
- 山東省濰坊市2023-2024學(xué)年高二下學(xué)期期末考試 歷史 含解析
- 中醫(yī)診療規(guī)范
- 報(bào)建協(xié)議書(shū)模板
- 第14課《葉圣陶先生二三事》導(dǎo)學(xué)案 統(tǒng)編版語(yǔ)文七年級(jí)下冊(cè)
- 貴州省2024年中考英語(yǔ)真題(含答案)
- 施工項(xiàng)目平移合同范本
- 北師大版八年級(jí)上冊(cè)數(shù)學(xué)期中綜合測(cè)試卷(含答案解析)
- 幼兒園創(chuàng)意美勞培訓(xùn)
- 同濟(jì)大學(xué)第四版線性代數(shù)課后習(xí)題答案
- 醫(yī)療領(lǐng)域人工智能技術(shù)應(yīng)用的倫理與法規(guī)
- 工地春節(jié)停工復(fù)工計(jì)劃安排
評(píng)論
0/150
提交評(píng)論