和runtime交互
Objective-C
程序和 runtime
系統有三種不同級別的交互。
- 通過
Objective-C
源代碼 - 通過
Foundation framework
中NSObject
類定義的方法。 - 直接調用
runtime
方法。
Objective-C 源代碼
大多數情況,runtime
默默無聞的在幕后自動工作。你僅僅需要書寫和編譯 Objective-C
代碼即可。
當你編譯包含 Objective-C
類和方法的時候,由于這門語言的動態特性,編譯器將生成數據結構和方法調用。數據結構捕獲了 class
的信息, category
的定義,protocol
的聲明;他們包含了那些在 The Objective-C Programming Language 中定義和聲明的 class
, protocol
,實例變量,方法選擇器,以及其他從源代碼中提取的信息。最重要的 runtime
方法就是發送消息,它被消息表達式所執行。 詳見 Message
NSObject 方法
在 Cocoa
中,大多數類繼承與 NSObject
,大多數對象繼承他定義的方法(NSProxy 是一個例外)詳見Message Forwarding。由于這種關系,每個對象和實例都有方法。然而,NSObject
僅僅定義了一些某些應該做的方法模板,它不提供所有必須的代碼。
例如,NSObject
定義了一個 description
,這個方法用來返回描述這個類的字符串。在 GDB
調試的時候,打印一個對象的時候輸出的字符串就是從這個方法返回的。NSObject
并不知道這個類包含什么,所以只是返回這個類的名字和地址。NSObject
的子類可以實現這個方法來返回更多的信息。例如 NSArray
這個類返回了它所包含的數據列表。
NSObject
的一些方法用于查詢 runtime
系統的一些信息。這些方法允許對象執行自我檢查。一些方法是類的實例方法,用來詢問對象來確定它的類;isKindOfClass:
isMemberOfClass:
用來測試這個對象在繼承鏈中的層級;respondsToSelector:
用來指示這個對象是否可以接收一個特定的消息;conformsToProtocol:
用來指示這個對象是否實現了具體協議的方法;methodForSelector:
用來返回實現該方法的地址。這些方法給了對象來確定自己的能力。
運行時方法
runtime
是一個動態的共享庫, /usr/include/objc
目錄下的頭文件提供了這些方法和數據結構。大多數的方法允許你用純 C 的方式去實現編譯器在處理你的 Objective-C
代碼時所做的工作。其他的基礎方法導出到了 NSObject
類中。這些方法使得開發其他 runtime
接口和工具成為了可能。當用 Objective-C
編碼的時候,并不需要這些。但是當用 Objective-C
編碼的時候,runtime
可能更好用。所有的方法都在 Objective-C Runtime Reference