iOS runtime學習筆記
一、什麼是Objective-C runtime?
簡單來說,Objective-C runtime是一個實現Objective-C語言的C庫。物件可以用C語言中的結構體表示,而方法(methods)可以用C函式實現。事實上,他們 差不多也是這麼幹了,另外再加上了一些額外的特性。這些結構體和函式被runtime函式封裝後,Objective-C程式設計師可以在程式執行時建立,檢 查,修改類,物件和它們的方法。
除了封裝,Objective-C runtime庫也負責找出方法的最終執行程式碼。當程式執行[object doSomething]時,不會直接找到方法並呼叫。相反,一條訊息(message)會傳送給物件(在這兒,我們通常叫它接收者)。runtime庫 給次機會讓物件根據訊息決定該作出什麼樣的反應。Alan Kay反覆強調訊息傳遞(message-passing)是Smalltalk最重要的部分(Objective-C根據Smalltalk發展而來),而不是物件。
Objective-C是一個面向執行時的語言。所以問題就是,什麼是一個執行時語言?一個執行時語言就是在應用程式執行的時候來決定函式內部實現什麼以及做出其它決定的語言。Objective-C是一個執行時語言嗎?不是。它是一個面向執行時的語言,這意味著只要有可能,它就把做決定的時間從編譯時和連結時延遲到這段程式碼真正執行的時候。正如前面指出的,Cocoa提供了iOS應用程式所需要的執行時環境
二、runtime中的訊息
①message(訊息)
message的具體定義很難說,因為並沒有真正的程式碼描述,簡單的講message 是一種抽象,包括了函式名+引數列表,他並沒有實際的實體存在。
②method(方法)
method是真正的存在的程式碼。如:- (int)meaning { return 42; }
③selector(方法選擇器)
selector 通過SEL型別存在,描述一個特定的method 或者說 message。在實際程式設計中,可以通過selector進行檢索方法等操作。
三、_cmd關鍵字
- (void)message
{
self.name = @"James";//通過self關鍵字給當前物件的屬性賦值
SEL currentSel = _cmd;//通過_cmd關鍵字取到當前函式對應的SEL
NSLog(@"currentSel is :%s",(char *)currentSel);
}
列印結果:
ObjcRunTime[693:403] currentSel is :message
四、Class 的定義
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
我們可以看到這裡這裡有兩個結構體,一個類結構體一個物件結構體。所有的 objc_object 物件結構體都有一個 isa 指標,這個 isa 指向它所屬的類,在執行時就靠這個指標來檢測這個物件是否可以響應一個 selector。完了我們看到最後有一個 id 指標。這個指標其實就只是用來代表一個 ObjC 物件,有點類似於 C++ 的泛型。當你拿到一個 id 指標之後,就可以獲取這個物件的類,並且可以檢測其是否響應一個 selector。這就是對一個 delegate 常用的呼叫方式。
五、IMP(Method Implementations)
typedef id (*IMP)(id self,SEL _cmd,...);
一個 IMP 就是一個函式指標,這是由編譯器生成的,當你發起一個 ObjC 訊息之後,最終它會執行的那個程式碼,就是由這個函式指標指定的。
參考連結:
相關文章
- iOS Block學習筆記iOSBloC筆記
- iOS Runloop學習筆記iOSOOP筆記
- iOS RunTime 學習記錄1_類和物件iOS物件
- Vue學習筆記(二)------axios學習Vue筆記iOS
- Vue學習筆記 —— axiosVue筆記iOS
- Axios用法–學習筆記iOS筆記
- iOS 屬性學習筆記iOS筆記
- iOS指標學習筆記iOS指標筆記
- substrate學習筆記11:無分叉runtime升級筆記
- iOS學習筆記02 UIScrollViewiOS筆記UIView
- iOS執行緒學習筆記iOS執行緒筆記
- iOS學習筆記-動畫篇1iOS筆記動畫
- iOS arc VS mrc學習筆記iOS筆記
- substrate學習筆記3:新增一個Pallet到Runtime筆記
- iOS學習筆記43 Swift(三)類iOS筆記Swift
- iOS學習筆記05 觸控事件iOS筆記事件
- IOS學習筆記——iOS元件之UIScrollView詳解iOS筆記元件UIView
- iOS學習筆記--PresentedVC自定義彈窗iOS筆記
- Xamarin 學習筆記 - 配置環境(Windows & iOS)筆記WindowsiOS
- iOS學習筆記04 檢視切換iOS筆記
- iOS學習筆記14 網路(三)WebViewiOS筆記WebView
- iOS學習筆記06 手勢識別iOS筆記
- iOS學習筆記47 Swift(七)泛型iOS筆記Swift泛型
- iOS學習筆記39 ReactiveCocoa入門iOS筆記React
- iOS學習筆記18 CoreData你懂的iOS筆記
- iOS-Socket開發學習筆記-1iOS筆記
- iOS學習筆記之 Objective-C (三)iOS筆記Object
- numpy的學習筆記\pandas學習筆記筆記
- iOS學習筆記——基礎控制元件(上)iOS筆記控制元件
- iOS學習筆記20 地圖(二)MapKit框架iOS筆記地圖APK框架
- iOS學習筆記01 APP啟動相關iOS筆記APP
- iOS學習筆記49 Swift(九)訪問控制iOS筆記Swift
- iOS學習筆記34 加速計和陀螺儀iOS筆記
- Objective C之NSDictionary學習筆記(IOS 9 1)Object筆記iOS
- iOS學習筆記-TableView效能優化篇1iOS筆記View優化
- iOS學習筆記-TableView效能優化篇2iOS筆記View優化
- IOS 學習筆記(1) 檢視UIViewControlleriOS筆記UIViewController
- IOS 學習筆記(3) 檢視UITabbarControlleriOS筆記UItabBarController