1.runtime是一套底層c語言的API(包含很多實用的c語言數據類型、c語言函數)
我們平時寫的OC代碼,底層都是基于runtime實現的,最終都會轉成runtime代碼
文檔:搜索runtime,<<Runtime Versions and Platforms>>
2.runtime有啥用
能動態(tài)產生一個類、成員變量、方法
能動態(tài)修改一個類、成員變量、方法
能動態(tài)刪除一個類、成員變量、方法
3.<runtime/message.h>? 和消息相關的頭文件
選中項目 - Project - Build Settings - ENABLE_STRICT_OBJC_MSGSEND? 將其設置為 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;
//所有的成員變量數組
Ivar *ivars = class_copyIvarList([Person class], &count);
for (int i = 0; i < count; i++) {
Ivar ivar = ivars[i];
//獲取一個成員變量名
const char *name = ivar_getName(ivar);
//獲取成員變量類型
const char *type = ivar_getTypeEncoding(ivar);
}
Objective-C語言是一門動態(tài)語言,它將很多靜態(tài)語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態(tài)語言的優(yōu)勢在于:我們寫代碼時能夠更具靈活性,如我們可以把消息轉發(fā)給我們想要的對象,或者隨意交換一個方法的實現等。
這種特性意味著Objective-C不僅需要一個編譯器,還需要一個運行時系統(tǒng)來執(zhí)行編譯的代碼。對于Objective-C來說,這個運行時系統(tǒng)就像
一個操作系統(tǒng)一樣:它讓所有的工作可以正常的運行。這個運行時系統(tǒng)即Objc Runtime。Objc
Runtime其實是一個Runtime庫,它基本上是用C和匯編寫的,這個庫使得C語言有了面向對象的能力。
Runtime庫主要做下面幾件事:
封裝:在這個庫中,對象可以用C語言中的結構體表示,而方法可以用C函數來實現,另外再加上了一些額外的特性。這些結構體和函數被runtime函數封裝后,我們就可以在程序運行時創(chuàng)建,檢查,修改類、對象和它們的方法了。
找出方法的最終執(zhí)行代碼:當程序執(zhí)行[object doSomething]時,會向消息接收者(object)發(fā)送一條消息(doSomething),runtime會根據消息接收者是否能響應該消息而做出不同的反應。這將在后面詳細介紹。
Objective-C runtime目前有兩個版本:Modern runtime和Legacy runtime。Modern Runtime
覆蓋了64位的Mac OS X Apps,還有 iOS Apps,Legacy Runtime 是早期用來給32位 Mac OS X Apps
用的,也就是可以不用管就是了。