運行時是OC的一個大特性。iOS的Runtime,使得很多本來在編譯階段的事情,放在了運行階段確定。這是OC作為動態(tài)語言的華彩部分.
體驗一下什么是動態(tài)語言
對于靜態(tài)語言,比如下面一段C語言,testEntry函數(shù)中調(diào)用functionA,就執(zhí)行functionA定義的代碼,調(diào)用functionB,就執(zhí)行functionB定義的代碼。編譯鏈接完成之后,執(zhí)行邏輯和順序就固定了。
#include < stdio.h >
void testEntry()
{
functionA(); // 輸出 I am functionA!
functionB(); // 輸出 I am functionB!
}
void functionA()
{
printf("I am functionA!");
}
void functionB()
{
printf("I am functionB!");
}
而對于動態(tài)語言,比如Objective-C的下面的代碼,在運行的時候,開始調(diào)用functionA,還能好好輸出I am functionA! 經(jīng)過一堆奇怪的操作之后,調(diào)用functionA 卻輸出了 I am functionB!
-(void)testEntry{
[self functionA]; //輸出 I am functionA !
// 下面一堆很奇怪的操作
Method funA_Method = class_getInstanceMethod([self class], @selector(functionA));
Method funB_Method = class_getInstanceMethod([self class], @selector(functionB));
method_exchangeImplementations(funA_Method, funB_Method);
[self functionA]; //這里卻會輸出 I am functionB !
}
-(void)functionA{
NSLog(@"I am functionA !");
}
-(void)functionB{
NSLog(@"I am functionB !");
}
這就是動態(tài)語言的效果。能夠在運行的時候變更代碼的執(zhí)行效果。寫好的代碼,定義好的對象,在運行的過程中都可能發(fā)生改變的。程序跑著跑著,我就不是我了。
Objective-C主要是通過runtime的東西來實現(xiàn)這種動態(tài)性的。
本文試著從以下幾方面說說runtime的事情:
Objective-C的runtime機制01-重要數(shù)據(jù)結(jié)構(gòu)和內(nèi)部關(guān)系圖
Objective-C的runtime機制02-消息機制
Objective-C的runtime機制03-動態(tài)創(chuàng)建和修改類和對象
Objective-C的runtime機制04-category
Objective-C的runtime機制05-常見的使用場景
另外,iOS runtime的源碼可以在這里下載閱讀:
http://opensource.apple.com/tarballs/objc4/
參考文獻
Objective-C Runtime Programming Guide
Objective-C Runtime Reference
《Effective Objective-C 2.0》
《pro multithreading and Management》
南峰子的技術(shù)博客-Objective-C Runtime 運行時
王中周的個人博客-Objective-C runtime之運行時
Understanding the Objective-C Runtime
刨根問底Objective-C Runtime
Type Encodings