1.runtime是一套底層c語(yǔ)言的API(包含很多實(shí)用的c語(yǔ)言數(shù)據(jù)類型、c語(yǔ)言函數(shù))
我們平時(shí)寫的OC代碼,底層都是基于runtime實(shí)現(xiàn)的,最終都會(huì)轉(zhuǎn)成runtime代碼
文檔:搜索runtime砾医,<<Runtime Versions and Platforms>>
2.runtime有啥用
能動(dòng)態(tài)產(chǎn)生一個(gè)類、成員變量衣厘、方法
能動(dòng)態(tài)修改一個(gè)類如蚜、成員變量、方法
能動(dòng)態(tài)刪除一個(gè)類影暴、成員變量错邦、方法
3.<runtime/message.h>? 和消息相關(guān)的頭文件
選中項(xiàng)目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND? 將其設(shè)置為 NO 即可
Person *p = [[Person alloc]init];
p.name = @"22";
objc_msgSend(p,@selector(setName:),@"xiaoming");
NSLog(@"%@",p.name);
4.<runtime/runtime.h>?
unsigned int count = 0;
//所有的成員變量數(shù)組
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
//獲取一個(gè)成員變量名
const char *name = ivar_getName(ivar);
//獲取成員變量類型
const char *type = ivar_getTypeEncoding(ivar);
}
Objective-C語(yǔ)言是一門動(dòng)態(tài)語(yǔ)言,它將很多靜態(tài)語(yǔ)言在編譯和鏈接時(shí)期做的事放到了運(yùn)行時(shí)來(lái)處理型宙。這種動(dòng)態(tài)語(yǔ)言的優(yōu)勢(shì)在于:我們寫代碼時(shí)能夠更具靈活性撬呢,如我們可以把消息轉(zhuǎn)發(fā)給我們想要的對(duì)象,或者隨意交換一個(gè)方法的實(shí)現(xiàn)等妆兑。
這種特性意味著Objective-C不僅需要一個(gè)編譯器魂拦,還需要一個(gè)運(yùn)行時(shí)系統(tǒng)來(lái)執(zhí)行編譯的代碼。對(duì)于Objective-C來(lái)說(shuō)搁嗓,這個(gè)運(yùn)行時(shí)系統(tǒng)就像
一個(gè)操作系統(tǒng)一樣:它讓所有的工作可以正常的運(yùn)行芯勘。這個(gè)運(yùn)行時(shí)系統(tǒng)即Objc Runtime。Objc
Runtime其實(shí)是一個(gè)Runtime庫(kù)腺逛,它基本上是用C和匯編寫的荷愕,這個(gè)庫(kù)使得C語(yǔ)言有了面向?qū)ο蟮哪芰Α?/p>
Runtime庫(kù)主要做下面幾件事:
封裝:在這個(gè)庫(kù)中,對(duì)象可以用C語(yǔ)言中的結(jié)構(gòu)體表示棍矛,而方法可以用C函數(shù)來(lái)實(shí)現(xiàn)安疗,另外再加上了一些額外的特性弦牡。這些結(jié)構(gòu)體和函數(shù)被runtime函數(shù)封裝后桦山,我們就可以在程序運(yùn)行時(shí)創(chuàng)建讼呢,檢查毕贼,修改類线得、對(duì)象和它們的方法了褒纲。
找出方法的最終執(zhí)行代碼:當(dāng)程序執(zhí)行[object doSomething]時(shí)路幸,會(huì)向消息接收者(object)發(fā)送一條消息(doSomething)糙及,runtime會(huì)根據(jù)消息接收者是否能響應(yīng)該消息而做出不同的反應(yīng)脐雪。這將在后面詳細(xì)介紹厌小。
Objective-C runtime目前有兩個(gè)版本:Modern runtime和Legacy runtime。Modern Runtime
覆蓋了64位的Mac OS X Apps战秋,還有 iOS Apps璧亚,Legacy Runtime 是早期用來(lái)給32位 Mac OS X Apps
用的,也就是可以不用管就是了脂信。