iOS-Runtime從入門到精通_第1頁
iOS-Runtime從入門到精通_第2頁
iOS-Runtime從入門到精通_第3頁
iOS-Runtime從入門到精通_第4頁
iOS-Runtime從入門到精通_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

目錄CONTENTS01NSObject02Class內(nèi)部成員03消息轉發(fā)04自省和消息替換05使用場景01NSObject什么是Runtime?iOS基于消息機制iOS運行時才決定要調(diào)用哪個方法〔動態(tài)調(diào)用〕Runtime是一個開源庫NSObjectNSObject有一局部在Runtime庫實現(xiàn)weakAutoreleasePool02Class內(nèi)部結構Class的內(nèi)部結構:內(nèi)部成員Class是一個指向objc_class的結構體指針——所以Class也是一種對象Class的內(nèi)部結構:內(nèi)部成員在Runtime中的定義MetaClass

Class的內(nèi)部結構:內(nèi)部成員類的isa成員objc_allocateClassPair:創(chuàng)立一個類以及MetaClassClass的內(nèi)部結構:內(nèi)部成員方法鏈表和方法緩存參數(shù)列表協(xié)議列表Class的內(nèi)部結構:IvarIvar表示類中的實例變量定義:Ivar是一個指向objc_ivar的結構體指針,包括了變量名稱〔ivar_name〕、變量類型〔ivar_type〕等信息Class的內(nèi)部結構:MetaClassClass和MetaClass關系圖Class的內(nèi)部結構:SELSEL定義:SEL是一個指向objc_selector的結構體指針,表示方法的簽名不同的類,可以擁有同一個SELClass的內(nèi)部結構:MethodMethod定義:Class中定義的methodList,保存的就是Method對象的集合performSelector又是什么鬼?運行時負責查找方法,編譯時不做任何校驗使用respondsToSelector預判方法是否存在performSelector語法同步,線程無關異步,僅限于主線程在主線程和子線程都可以執(zhí)行performSelector語法調(diào)用指定線程中的某個方法開啟子線程在后臺運行Class的內(nèi)部結構:IMPIMP是implementation的縮寫,定義如下:任何繼承自NSObject的類對象,都可以使用id來替代,因為id本身是一個指向objc_object類型的結構體指針Class的內(nèi)部結構:IMPIMP是一個函數(shù)指針〔方法實現(xiàn)地址〕IMP包括以下參數(shù):id:一個接收消息的對象SEL:要調(diào)用的方法不定個數(shù)的方法參數(shù),可選,從0到,與OC對應的方法參數(shù)一致Block也是一種IMPClass的內(nèi)部結構:objc_msgSend

定義:iOS在執(zhí)行任何方法時都會將其轉到這個函數(shù)也具有和IMP一樣的參數(shù)Class的內(nèi)部結構:objc_msgSend

Student*小明=[[Studentalloc]init];[小明談戀愛];[小明抄作業(yè)(@”物理”)];調(diào)用Student類中的“談戀愛”方法,就是在Student類的方法鏈表中查找名為“談戀愛”的SEL所對應的IMP〔方法實現(xiàn)地址〕,找到了就執(zhí)行,找不到再想別的方法。上述這些動作是由objc_msgSend函數(shù)來完成的,是iOS系統(tǒng)在執(zhí)行[小明談戀愛];這個方法時,將其自動轉到objc_msgSend函數(shù)的。Class的內(nèi)部結構:方法緩存objc_msgSend函數(shù)每次都要在類的方法列表中根據(jù)SEL去查找IMP為了提高查找速度,設計出方法緩存如果當前類的方法緩存和鏈表中都找不到,就去它的父類尋找,找到那么參加當前類的緩存中03消息轉發(fā)消息轉發(fā)如果objc_msgSend找不到怎么辦? -->拋出unrecognizedselectorsenttoxxx異常補救措施〔按順序執(zhí)行〕:MethodResolutionFastForwardingNormalForwarding消息轉發(fā):流程圖消息轉發(fā):消息轉發(fā)之MethodResolution

在要調(diào)用的方法所在的類增加resolveInstanceMethod方法,讓別的方法去處理:

消息轉發(fā):消息轉發(fā)之FastForwarding在要調(diào)用的方法所在的類增加forwardingTargetForSelector方法,移花接木,讓別的類去處理:

消息轉發(fā):消息轉發(fā)之NormalForwarding在要調(diào)用的方法所在的類增加forwardInvocation和methodSignatureForSelector方法,移花接木,讓別的類去處理:

三種轉發(fā)機制的比較MethodResolution:在自己及父類中尋找FastForwarding:在別的類尋找NormalForwarding:與消息相關的所有信息都封裝在NSInvocation對象中,包括SEL、方法參數(shù)等NormalForwarding中的

v@:

第一個參數(shù)v,表示返回類型,v表示void第二個參數(shù)@,表示id,固定值第三個參數(shù):,表示SEL,固定值如果還有第4個甚至更多的字符,那就是代表SEL所對應的方法參數(shù)了,一般都對應@,即NSObject

NormalForwarding中的v@:

符號代表類型*char*^typetype

*@NSObject

*

id^@NSError

**#NSObjectvvoid:SEL消息轉發(fā)的最后一步〔第四步〕:doesNotRecognizeSelectordoesNotRecognizeSelector

由系統(tǒng)提供負責拋出異常用消息轉發(fā)實現(xiàn)多重繼承在Parent類定義eat方法,但是不實現(xiàn)在Child類定義并實現(xiàn)eat方法在Parent類使用forwardingTargetForSelector方法04自省、消息替換和關聯(lián)對象概述iOSRuntime=

自省

方法替換自?。韩@取信息的函數(shù)方法替換:修改或新增方法的函數(shù)自省〔introspective〕自省是對象的固有能力,即程序運行時,對象可根據(jù)一些方法,獲取自身的信息,或動態(tài)執(zhí)行一些方法我是誰?自省〔introspective〕方法名稱作用class返回對象的類isKindOfClass檢查對象是否在指定的類繼承體系中isMemberOfClass檢查對象是否在指定的類繼承體系中respondsoSelector檢查對象能否相應指定的消息conformsToProtocol檢查對象是否實現(xiàn)了指定協(xié)議類的方法methodForSelector返回指定方法實現(xiàn)的地址performSelector:withObject執(zhí)行SEL所指代的方法NSObject提供的自省方法:自省〔introspective〕object_getClass和object_getClassName:

取得任意一個對象的類和類名

多用于判斷類型

自省〔introspective〕class_copyPropertyList:獲取類的所有屬性列表,得到一個數(shù)組property_getName:獲取到某個屬性的名稱自省〔introspective〕class_copyMethodList:

獲取類的所有方法列表,得到一個數(shù)組method_getName:

獲取到每個方法對應的SEL

類似的,關于獲取Ivar的方法自省〔introspective〕帶有From文字的方法:NSClassFromString:反射可用于導航器

可用于判斷某個class是否存在NSSelectorFromString:從字符串中反射得到Selector類型:方法替換〔MethodSwizzing〕object_setClass

用于把一個對象設置為一個新的類型方法替換〔MethodSwizzing〕load和initialize方法用于類的加載和初始化,是一開始就執(zhí)行的方法方法替換〔MethodSwizzing〕objc_allocateClassPair 用于動態(tài)創(chuàng)立一個新類 同時還創(chuàng)立了新類的MetaClass

指定新類繼承自NSObject方法替換〔MethodSwizzing〕class_addMethod

為一個類增加新的方法

為ClassA新增一個方法doSomething,指定它的實現(xiàn)〔IMP〕是newMethod方法替換〔MethodSwizzing〕class_addMethod

為一個類增加新的方法,帶參數(shù)的實現(xiàn)

為ClassA新增一個方法doSomething,指定它的實現(xiàn)〔IMP〕是newMethod方法替換〔MethodSwizzing〕method_setImplementation

為類的某個原有方法Method設置一個新的IMP實現(xiàn)

把Person的sayHello方法實現(xiàn)替換為sayHi方法實現(xiàn)方法替換〔MethodSwizzing〕class_replaceMethod 把一個類的某個方法,替換為另一個方法是method_setImplementation和class_addMethod這兩種場景的組合1〕舊的方法SELname如果不存在,那其實就是調(diào)用class_AddMethod方法,這時候types參數(shù)就是非常有用的了。2〕舊的方法SELname如果存在,那其實就是調(diào)用method_setImplementation方法方法替換〔MethodSwizzing〕class_replaceMethod的例子:

把Person的sayHello方法實現(xiàn)替換為sayHi方法實現(xiàn)方法替換〔MethodSwizzing〕method_exchangeImplementations交換兩個方法的實現(xiàn)

關聯(lián)對象:為一個類增加新方法或屬性使用Category:缺點是不能增加屬性使用關聯(lián)對象:把兩個對象關聯(lián)起來objc_setAssociatedObjectobjc_getAssociatedObjectobjc_removeAssociatedObjects:很少使用分為靜態(tài)和動態(tài)兩種方式05使用場景使用場景:AOP面向切面編程日志記錄性能統(tǒng)計平安控制事務處理異常處理使用場景:AOPAOP的優(yōu)勢:減少切面業(yè)務的開發(fā)量減少代碼耦合,方便復用提高代碼review的質量使用場景:減少機械性的if判斷?使用場景:寫日志使用場景:Aspects提供的方法使用場景:Aspects寫入配置文件使用場景:Aspects讀取配置文件使用場景:NSProxyNSProxy也是一個根類,類似于NSObjectNSProxy是一個抽象類,實現(xiàn)了NSObject協(xié)議NSProxy是一種高級的代理,通過Runtime的消息轉發(fā)機制代理模式的實現(xiàn)靜態(tài)代理NSProxy繼承NSProxy-delegate提供消息轉發(fā)機制-methodSignatureForSelec

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論