Runtime簡介
Runtime是Objective-C的一個固有特性,及在編譯階段並不能確定真正調用的函數名,函數的調用在運行時纔得到確認。所以我們可以看到,OC在編譯階段沒有報錯的情況下,會在運行過程中出現閃退和崩潰的錯誤,而C語言在編譯過程中就會報錯。
消息轉發
執行對象相對的緩存方法 ->
執行執行對象方法列表的方法 ->
執行父類指針指向的方法 ->
執行攔截調用的方法 ->
消息機制 - objc_msgSend(obj,@selector(函數名)) 函數相關的消息轉發機制
發送消息- 方法的調用就是對象發送消息 [p eatApple]; => objc_msgSend(p, @selector(eatApple));
iOS的錯誤處理 - 編譯未出報錯,運行卻閃退
動態調用特性(C語言-函數在編譯時就會決定調用哪個函數),運行時才確定需要調用的函數
Runtime術語
SEL
id
Class
通過runtime獲取類的相關屬性名字
- 獲取類的屬性列表:property_getName
- 獲取類的方法列表:class_copyMethodList
- 獲取成員變量列表:class_copyIvarList
- 獲取協議列表:class_copyProtocolList
動態調用
@selector 屬於runtime中的動態添加方法
關聯對象
關聯對象:爲系統的類添加屬性(非繼承)
//首先定義一個全局變量,用它的地址作爲關聯對象的key
static char associatedObjectKey;
//設置關聯對象
objc_setAssociatedObject(target, &associatedObjectKey, @"添加的字符串屬性", OBJC_ASSOCIATION_RETAIN_NONATOMIC); //獲取關聯對象
NSString *string = objc_getAssociatedObject(target, &associatedObjectKey);
NSLog(@"AssociatedObject = %@", string);
方法交換
method_exchangeImplementations