一、runtime簡介
1.RunTime簡稱運行時。OC就是運行時機制,也就是在運行時候的一些機制,其中最主要的是消息機制。
2.對于C語言,函數的調用在編譯的時候會決定調用哪個函數。
3.對于OC的函數,屬于動態調用過程,在編譯的時候并不能決定真正調用哪個函數,只有在真正運行的時候才會根據函數的名稱找到對應的函數來調用。
4.事實證明:
在編譯階段,OC可以調用任何函數,即使這個函數并未實現,只要聲明過就不會報錯。
在編譯階段,C語言調用未實現的函數就會報錯。
二、runtime的使用
測試類中的頭文件如下:
在需要實現的類中導入對應的頭文件?
#import? ? <objc/runtime.h> //? 導入運行時文件
1.得到類名和得到類中所有的成員變量和其對應的類型
用到的函數:
獲取對應的類名: ?const? char *class_getName(Class cls) ? ?cls:傳對應的類名,返回的是字符串(C語言中的字符串),后面轉為NSString即可
得到某個類中所有的成員變量:Ivar *class_copyIvarList(Class cls,unsigned? int*outCount) ? ?cls:傳對應的類名,outCount:成員變量的長度(int類型),返回所有的成員變量(Ivar類型)
得到某個成員變量的類型:? const char *ivar_getTypeEncoding(Ivar v) ? ? v:具體的成員變量,返回的是變量的類型(C語言中的字符串),后面轉為NSString即可
得到某個成員變量的名字 const char? *ivar_getName(Ivar v)? ? v:具體的成員變量,返回的是變量的名字(C語言中的字符串),后面轉為NSString即可
下面的一些用到的函數代碼就不做說明了,具體看截圖代碼的返回值
對應的結果如下:
2.得到類中所有的屬性
3.得到類中所有的方法
"calculateAllValue:needMoney:other:" 是我在 TestGetClassName.h 文件中聲明的方法: -(void)calculateAllValue:(NSString *)ageValue needMoney:(NSNumber *)moneyValue other:(NSNumber *)other;? 并且在 TestGetClassName.m 實現了這個方法的,當然了,你也可以在.m文件中直接實現,不需要聲明。
.cxx_destruct 方法是系統調用的方法,只有在ARC下這個方法才會出現,只有當前類擁有實例變量時(不論是不是用property)這個方法才會出現
4.得到類中遵守的所有協議
5.兩個方法相互交換
6.方法替換
7.給一個類添加方法
8.屬性關聯
用到的設置函數: ? void objc_setAssociatedObject(id object,const void*key,id value, objc_AssociationPolicy? policy)? ? ? object:源對象? key:關鍵字(唯一靜態變量) value:設置的值 policy:關聯策略(具體看其對應的枚舉)
用到的得到函數:? id? objc_getAssociatedObject(id object,const? void*key)? ? object:源對象? key:關鍵字(唯一靜態變量,和上面一一對應)
三、簡單的使用場景
1.是通過運行時,獲取屬性對應的成員變量,將對象對應的屬性以及值進行歸檔和解檔。其中藍色方框中的是之前原始的寫法。