iOS開發中Runtime的實際應用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章