Runtime是什么
Runtime 又叫運行時氏堤,是一套底層的 C 語言 API评肆,其為 iOS 內(nèi)部的核心之一,我們平時編寫的 OC 代碼毁嗦,底層都是基于它來實現(xiàn)的。比如:
[receiver message];
// 底層運行時會被編譯器轉(zhuǎn)化為:
objc_msgSend(receiver, selector)
// 如果其還有參數(shù)比如:
[receiver message:(id)arg...];
// 底層運行時會被編譯器轉(zhuǎn)化為:objc_msgSend(receiver, selector, arg1, arg2, ...)
為什么需要Runtime
- Objective-C 是一門動態(tài)語言回铛,它會將一些工作放在代碼運行時才處理而并非編譯時狗准。也就是說,有很多類和成員變量在我們編譯的時是不知道的茵肃,而在運行時腔长,我們所編寫的代碼會轉(zhuǎn)換成完整的確定的代碼運行。
- 因此验残,編譯器是不夠的捞附,我們還需要一個運行時系統(tǒng)(Runtime system)來處理編譯后的代碼。
- Runtime 基本是用 C 和匯編寫的您没,由此可見蘋果為了動態(tài)系統(tǒng)的高效而做出的努力鸟召。蘋果和 GNU 各自維護(hù)一個開源的 Runtime 版本,這兩個版本之間都在努力保持一致氨鹏。
Runtime 的作用:OC 在三種層面上與 Runtime 系統(tǒng)進(jìn)行交互
通過 Objective-C 源代碼
只需要編寫 OC 代碼欧募,Runtime 系統(tǒng)自動在幕后搞定一切,調(diào)用方法仆抵,編譯器會將 OC 代碼轉(zhuǎn)換成運行時代碼跟继,在運行時確定數(shù)據(jù)結(jié)構(gòu)和函數(shù)。通過 Foundation 框架的 NSObject 類定義的方法
Cocoa 程序中絕大部分類都是 NSObject 類的子類镣丑,所以都繼承了 NSObject 的行為还栓。(NSProxy 類時個例外,它是個抽象超類)
一些情況下传轰,NSObject 類僅僅定義了完成某件事情的模板剩盒,并沒有提供所需要的代碼。例如 - description方法,該方法返回類內(nèi)容的字符串表示辽聊,該方法主要用來調(diào)試程序纪挎。NSObject類并不知道子類的內(nèi)容,所以它只是返回類的名字和對象的地址跟匆,NSObject的子類可以重新實現(xiàn)异袄。
還有一些NSObject的方法可以從Runtime系統(tǒng)中獲取信息,允許對象進(jìn)行自我檢查玛臂。例如:
-class方法返回對象的類烤蜕;
-isKindOfClass: 和 -isMemberOfClass: 方法檢查對象是否存在于指定的類的繼承體系中(是否是其子類或者父類或者當(dāng)前類的成員變量);
-respondsToSelector: 檢查對象能否響應(yīng)指定的消息迹冤;
-conformsToProtocol:檢查對象是否實現(xiàn)了指定協(xié)議類的方法讽营;
-methodForSelector: 返回指定方法實現(xiàn)的地址。通過對 Runtime 庫函數(shù)的直接調(diào)用
Runtime 系統(tǒng)是具有公共接口的動態(tài)共享庫泡徙。頭文件存放于/usr/include/objc目錄下橱鹏,這意味著我們使用時只需要引入objc/Runtime.h頭文件即可。
許多函數(shù)可以讓你使用純 C 代碼來實現(xiàn) Objc 中同樣的功能堪藐。除非是寫一些 Objc 與其他語言的橋接或是底層的 debug 工作莉兰,你在寫 Objc 代碼時一般不會用到這些 C 語言函數(shù)。
runtime實現(xiàn)的機制是什么,怎么用礁竞,一般用于干嘛. 你還能記得你所使用的相關(guān)的頭文件或者某些方法的名稱嗎糖荒?
- 需要導(dǎo)入<objc/message.h><objc/runtime.h>
- runtime,運行時機制模捂,它是一套C語言庫
- 實際上我們編寫的所有OC代碼寂嘉,最終都是轉(zhuǎn)成了runtime庫的東西,比如類轉(zhuǎn)成了runtime庫里面的結(jié)構(gòu)體等數(shù)據(jù)類型枫绅,方法轉(zhuǎn)成了runtime庫里面的C語言函數(shù)泉孩,平時調(diào)方法都是轉(zhuǎn)成了objc_msgSend函數(shù)(所以說OC有個消息發(fā)送機制)
- 因此,可以說runtime是OC的底層實現(xiàn)并淋,是OC的幕后執(zhí)行者
- 有了runtime庫寓搬,能做什么事情呢?runtime庫里面包含了跟類县耽、成員變量句喷、方法相關(guān)的API,比如獲取類里面的所有成員變量兔毙,為類動態(tài)添加成員變量唾琼,動態(tài)改變類的方法實現(xiàn),為類動態(tài)添加新的方法等
- 因此澎剥,有了runtime锡溯,想怎么改就怎么改
---->>>>Runtime詳解(面試必備)