runtime是個很屌的東西,但是也并不是很高深的東西,iOS學到一定程度不可避免的就要搞它了,經過最近幾個月頻繁的學習和去了解,逐漸解開了runtime的神秘面紗,讓我們一探究竟吧。
runtime叫做運行時,好多語言都有運行時,我也不知道除了OC還有啥,哈哈哈,顧名思義,運行的時候,其實也就是程序運行的時候所發生的一些事,OC的運行時主要是消息轉發機制。
OC這個語言我們平時都寫.h和.m,一個是interface一個是implement,我們都在.h定義接口啊,聲明屬性,定義方法啥的,然后.m里面寫上具體的實現細節,我的理解,首先,我們寫的OC,到運行時都變成C語言,然后調用方法都是發消息,大概是有個方法列表,列表里對應有一個方法實現的指針IMP,然后,調用方法就是objc_msgsend,也就是OC中所有方法都是發消息實現的
1.發送消息
// 創建person對象
Person*p = [[Person alloc] init];
// 調用對象方法
[p eat];
// 本質:讓對象發送消息
objc_msgSend(p,@selector(eat));
// 調用類方法的方式:兩種
// 第一種通過類名調用
[Person eat];
// 第二種通過類對象調用
[[Person class]eat];
// 用類名調用類方法,底層會自動把類名轉換成類對象調用
// 本質:讓類對象發送消息
objc_msgSend([Person class],@selector(eat));
原理:方法在runtime里面調用的是
比如:
objc_msgSend([Person class],@selector(eat));
實際上:
objc_msgSend(XXXXXX,@selector(YYYYYY));
XXXX就是就收消息的對象,YYYYY就是就收消息后執行的方法,所以比如這里的@selector()實際上是一個SEL,這個東西好像是對應一個數也不一個字符串的,然后根據這個東西,runtime運行時的時候,找這個方法,然后每個方法對應他的執行代碼的一個IMP指針,然后再執行。
2.交換方法
這個方法的實現主要就是取到方法對應的IMP實現通過method_exchangeImplementations
交換實現,進而實現方法的交換。
3.添加方法
4.不需要引入某個類的頭文件,直接初始化該類對象