首先咱們先了解一下運行時實現機制及做用面試
一、運行時實現的機制是什麼?框架
運行時是一套比較底層的純C語言API,屬於1個C語言庫,包含了不少底層的C語言API。函數
在咱們平時編寫的OC代碼中,程序運行過程時,其實最終都是轉成了運行時的C語言代碼,運行時算是OC的幕後工做者學習
好比說,下面一個建立對象的方法中,編碼
舉例:code
主管:對象
[[MJPerson alloc]init]blog
運行時:接口
objc_msgSend(objc_msgSend(「MJPerson」,「alloc」),「init」)開發
二、運行時用來幹什麼呢??用在那些地方呢?
運行時是屬於OC的底層,能夠進行一些很是底層的操做(用OC事沒法實現的,很差實現)
(1)在程序運行過程當中,動態建立一個類(好比KVO的底層實現)
(2)在程序運行過程當中,動態地爲某個類添加屬性\方法,修改屬性值\方法
(3)遍歷一個類的全部成員變量(屬性)\全部方法
例如:咱們須要對一個類的屬性進行歸檔解檔的時候屬性特別的多,這時候,咱們就會寫不少對應的代碼,可是若是使用了運行時就能夠動態設置!
例如,PYPerson.h的文件以下所示
進口
@接口PYPerson:NSObject
@屬性(非原子,賦值)國際年齡;
@屬性(非原子,賦值)int高度;
@Property(非原子,複製)NSString*名稱;
@Property(非原子,賦值)int AGE 2;
@屬性(非原子,賦值)整高2;
@Property(非原子屬性,賦值);
@屬性(非原子,賦值)整高3;
@Property(非原子,賦值)4歲;
@屬性(非原子,賦值)整高4;
@End
而PYPerson.m實現文件的內容以下
進口
@Implementation PYPerson
(Void)CoithCoder:(NSCoder))編碼器
{
無符號整數=0;
艾瓦爾Ivars=class_CopyIvarList([PYPerson類],&count);
對於(int i=0;i<count;i++){
// 取出i位置對應的成員變量
Ivar ivar = ivars[i];
// 查當作員變量
const char *name = ivar_getName(ivar);
// 歸檔
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[encoder encodeObject:value forKey:key];
}
免費(象牙);
}
(ID)initWithCoder:(NSCoder*)解碼器
{
若是(Self=[Superinit]){
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([PYPerson class], &count);
for (int i = 0; i<count; i++) {
// 取出i位置對應的成員變量 Ivar ivar = ivars[i]; // 查當作員變量 const char *name = ivar_getName(ivar); // 歸檔 NSString *key = [NSString stringWithUTF8String:name]; id value = [decoder decodeObjectForKey:key]; // 設置到成員變量身上 [self setValue:value forKey:key]; } free(ivars); } 迴歸自我; } @End
這樣咱們能夠看到歸檔和解檔的案例實際上是運行時寫下的
做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:519832104 無論你是小白仍是大牛歡迎入駐,分享經驗,討論技術,你們一塊兒交流學習成長!
另附上一份各好友收集的大廠面試題,須要iOS開發學習資料、面試真題,能夠添加iOS開發進階交流羣,進羣可自行下載!
學習,運行時機制首先要了解下面幾個問題
相關的頭文件和函數
1>頭文件
利用頭文件,咱們能夠查看到運行時中的各個方法!
2>相關應用
nscoding(歸檔和解檔,利用運行時遍歷模型對象的全部屬性)
字典->模型(利用運行時遍歷模型對象的全部屬性,根據屬性名從字典中取出對應的值,設置到模型的屬性上)
利用運行時動態產生一個類
(用於封裝框架(想怎麼改就怎麼改)
這就是咱們運行時機制的只要運用方向
3>相關函數
objc_msgSend:給對象發送消息
類複製方法:遍歷某個類全部的方法
類拷貝列表:遍歷某個類全部的成員變量
NSString*NSStringFromSelector(賽爾(A Selector);方法名轉字符串
賽爾NSSelectorFromString(NSString*a SelectorName);字符串轉方法名
NSString*NSStringFromClass(類aclass);類名轉字符串
NSClassFromString類(NSString*aClassName);字符串轉類名
NSStringNSStringFromProtocol(協議Proto);協議名轉字符串
協議NSProtocolFromString(NSStringnamestr);字符串轉協議名
這是咱們學習運行時必須知道的函數!