《Objective-C Runtime分析(一)-Runtime初步》

來源:互聯網
上載者:User

標籤:

http://www.tekuba.net/program/335/

本系列主要參考資料:
Objective-C Runtime Reference
Objective-C Runtime Programming Guide
涉及主要檔案:objc/message.h,objc/objc-api.h,objc/objc.h,objc/runtime.h
特酷吧[tekuba.net]採用"署名-非商業用途-保持一致"的創作共用協議,使用本文內容請遵循該協議
Objective-C Runtime是Objective-C的基礎內容,理解了Objective-C Runtime對於掌握Objective-C的很多技術原理非常有用。特酷吧特別整理了Objective-C Runtime的內容,共六篇,本文是第一篇:
《Objective-C Runtime分析(一)-Runtime初步》
《Objective-C Runtime分析(二)-Class,Method,SEL,IMP》
《Objective-C Runtime分析(三)-objc_msgSend》
《Objective-C Runtime分析(四)--Dynamic Method Resolution》
《Objective-C Runtime分析(五)-Message Forwarding》
《Objective-C Runtime分析(六)-Type Encodings & Declared Properties》

一,什麼是Objective-C Runtime
簡單的說,Objective-C是一門動態語言,它會將編譯和連結時要做的事情延遲到運行時進行。這就意味著Objective-C語言不僅需要一個編譯環境,還需要一個運行時系統(動態語言一般都會有自己的運行時系統,比如JAVA Runtime)來執行編譯好的代碼。Objective-C Runtime好比Objective-C的作業系統,Objective-C基於Objective-C Runtime來工作。因此,可以說Objective-C Runtime是Objective-C的基礎,靈魂。

二,動態語言 VS 靜態語言
特酷吧在最開始接觸Objective-C Runtime,看到上方的解釋時還是一頭霧水,到底什麼樣的語言才算是動態語言?別急,看完下面的例子,你就應該清楚了。
用靜態語言C語言寫出下面的代碼:

摺疊展開C/C++ Code複製內容到剪貼簿
  1. #include <stdio.h>  
  2. int main(int argc, const char **argv[])  
  3. {  
  4.         printf("Hello tekuba!");  
  5.       return 0;  
  6. }  


把代碼編譯,會經過編譯器文法分析,最佳化翻譯成機器語言,系統按照你設計的邏輯和自上而下的執行你的代碼。
而在Objective-C中,都是發送訊息,比如:
[tekuba  hello];
會被編譯器替換成成:
objc_msgSend(tekuba, selector);
如果有參數,則可能是:
objc_msgSend(tekuba , selector, arg1, arg2, …);
訊息只有到運行時才會和函數實現綁定起來,而不是像C語言一樣按照編譯好的邏輯一成不變的執行。也就是說,編譯階段只是確定了要向tekuba對象發送hello訊息,但是卻沒有發送,真正發送是等到啟動並執行時候進行。因此,編譯階段完全不知道hello方法的具體實現,甚至該方法到底有沒有被實現也不知道。說到這裡,特酷吧想到了之前接觸windows編程的時候,有個很重要的概念:“windows的訊息機制”,特酷吧的理解是它其實也是一種“runtime”機制。但因為它不像NSObject-C這樣具有自我檢查等優秀的能力,所以看上去並不是特別突出。
也就是說,所謂的“runtime”實際上就是一個管理運行代碼的環境機制,保證了代碼在運行中有自我檢查,判斷的能力。
 
三,Objective-C runtime是開源的
目前蘋果公司和GNU各自維護一個開源的runtime版本。蘋果的項目地址是:http://opensource.apple.com/tarballs/objc4/
The Objective-C Runtime is open source and available anytime from http://opensource.apple.com. In fact examining the Objective-C is one of the first ways I went through to figure out how it worked, beyond reading Apples documentation on the matter. You can download the current version of the runtime (as of this writting) for Mac OS X 10.6.2 here objc4-437.1.tar.gz.
Objective-c runtime是由C語言實現的。runtime作為Objective-C最核心的部分幾乎全部由C語言實現。這裡的“幾乎”所指的例外就包含有的方法(比如objc_msgSend方法)甚至是用彙編實現的。


四,和Objective-C runtime互動
參考:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtInteracting.html
Objective-C程式有三種途徑和運行時系統互動[Objective-C programs interact with the runtime system at three distinct levels: through Objective-C source code; through methods defined in the NSObject class of the Foundation framework; and through direct calls to runtime functions]。
1、Objective-C Source Code
大部分情況下,運行時系統在後台自動運行,我們只需編寫和編譯 Objective-C 原始碼。
當編譯Objective-C類和方法時,編譯器為實現語言動態特性將自動建立一些資料結構和函數。這些資料結構包含類定義和協議類定義中的資訊,

2、NSObject Methods
Cocoa程式中絕大部分類都是NSObject類的子類,所以大部分都繼承了NSObject類的方法,因而繼承 了NSObject的行為(NSProxy類是個例外)。然而,某些情況下, NSObject類僅僅定義了完成某件事情的模板,而沒有提供所有需要的代碼。
例如,NSObject 類定義了description方法,返回該類內容的字串表示。這主要是用來偵錯工具:GDB 中的 print-object 方法就是直接列印出該方法返回的字串。NSObject 類中該方法的 實現並不知道子類中的內容,所以它只是返回類的名字和對象的地址。NSObject 的子類可以重新實現該方法以提供更多的資訊。例如,NSArray 類改寫了該方法來返回 NSArray 類包含的每個對象的內容。
某些 NSObject 的方法只是簡單地從運行時系統中獲得資訊,從而允許對象進行一定程度的自我檢查。例如,class 返回對象的類;isKindOfClass:和 isMemberOfClass:則檢查對象是否在指定的 類繼承體系中;respondsToSelector:檢查對象能否響應指定的訊息;conformsToProtocol: 檢查對象是否實現了指定協議類的方法;methodForSelector:則返回指定方法實現的地址。

3、Runtime Functions
運行時系統是一個有公開介面的動態庫,由一些資料結構和函數的集合組成,這些資料結構和函數的聲明 標頭檔在/usr/include/objc中。這些函數支援用純C的函數來實現和Objective-C同樣的功能。還有一些函數構成了 NSObject 類方法的基礎。這些函數使得訪問運行時系統介面和提供開發工具成為可 能。儘管大部分情況下它們在 Objective-C 程式不是必須的,但是有時候對於 Objecitve-C 程式來說某些函 數是非常有用的。

其他:
Objective-C runtime的版本和適用平台等
https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtVersionsPlatforms.html
轉載請註明來自特酷吧,本文地址:http://www.tekuba.net/program/335/
推薦閱讀:
IOS NSTimer的使用須知
IOS 在應用中開啟另外一個應用
IOS 旋轉螢幕控制詳解
IOS國際化須知

想及時擷取特酷吧的更新?想瞭解iOS,android開發最新技術動態,點擊或掃描下方二維碼下載“多識閱讀”App,豐富的iOS,Android,Web等領域開發人員部落格隨你訂閱。

下一篇:Objective-C Runtime分析(二)-Class,Method,SEL,IMP

 

 

 

《Objective-C Runtime分析(一)-Runtime初步》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.