首先我們先瞭解一下運行時實現機制及作用 1、運行時實現的機制是什麼? 運行時是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。 在我們平時編寫的OC代碼中,程式運行過程時,其實最終都是轉成了運行時的C語言代碼,運行時算是OC的幕後工作者 比如說,下麵一個創建對象的方法中 ...
首先我們先瞭解一下運行時實現機制及作用
1、運行時實現的機制是什麼?
運行時是一套比較底層的純C語言API,屬於1個C語言庫,包含了很多底層的C語言API。
在我們平時編寫的OC代碼中,程式運行過程時,其實最終都是轉成了運行時的C語言代碼,運行時算是OC的幕後工作者
比如說,下麵一個創建對象的方法中,
舉例:
主管:
[[MJPerson alloc]init]
運行時:
objc_msgSend(objc_msgSend(“MJPerson”,“alloc”),“init”)
2、運行時用來乾什麼呢??用在那些地方呢?
運行時是屬於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實現文件的內容如下
import "PYPerson.h"
進口
@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);字元串轉協議名
這是我們學習運行時必須知道的函數!