iOS高級開發工程師面試——RunTime
- 一、簡介
- 二、介紹下 RunTime 的內存模型(isa、對象、類、metaclass、結構體的存儲信息等)
-
- 對象
- 類
- 三、為什么要設計 metaclass ?
- 四、class_copyIvarList & class_copyPropertyList區別?
- 五、class_rw_t 和 class_ro_t 的區別?
- 六、category如何被加載的?兩個 category 的load方法的加載順序?兩個 category 的同名方法的加載順序?
- 七、category & extension區別?能給 NSObject 添加 Extension 嗎?結果如何?
- 八、 消息轉發機制,消息轉發機制和其他語言的消息機制優劣對比?
- 九、在方法調用的時候,方法查詢-> 動態解析-> 消息轉發 之前做了什么 ?
- 十、IMP、SEL、Method的區別和使用場景
- 十一、load、initialize方法的區別什么?在繼承關系中他們有什么區別?
- 十二、說說消息轉發機制的優劣?
- 十二、iOS你在項目中用過 RunTime 嗎?舉個例子。
- 十三、RunTime 是如何把 weak變量的自動置 nil 的?
- 十四、objc中向一個 nil 對象發送消息將會發生什么?
一、簡介
Objective-C
語言是一門動態語言。它把一些決策從編譯階段
、鏈接階段
推遲到運行時
階段,實現該機制的基礎就是 runtime
(又叫作運行時)。
Runtime 提供的接口基本都是 C 語言,源碼由 C\C++\匯編語言編寫。Runtime API 為 Objective-C 語言的動態屬性提供支持,充當一種用于 Objective-C 語言的操作系統,使得該語言正常運轉工作。
二、介紹下 RunTime 的內存模型(isa、對象、類、metaclass、結構體的存儲信息等)
對象
OC中的對象指向的是一個objc_object
指針類型,typedef struct objc_object *id
;從它的結構體中可以看出,它包括一個isa
指針,指向的是這個對象的類對象,一個對象實例就是通過這個isa
找到它自己的Class
,而這個Class
中存儲的就是這個實例的方法列表、屬性列表、成員變量列表等相關信息的。
/// Represents an instance of a class.
struct objc_object {Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
類
在OC中的類是用Class
來表示的,實際上它指向的是一個objc_class
的指針類型,typedef struct objc_class *Class
;對應的結構體如下:
struct objc_class {Class _Nonnull isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__Class _Nullable super_class OBJC2_UNAVAILABLE;const char * _Nonnull name OBJC2_UNAVAILABLE;long version OBJC2_UNAVAILABLE;long info OBJC2_UNAVAILABLE;long instance_size OBJC2_UNAVAILABLE;struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;#endif}
從結構體中定義的變量可知,OC的Class類型包括如下數據(即:元數據metadata
):super_class(父類類對象)
;
name(類對象的名稱)
;
version、info(版本和相關信息)
;
instance_size(實例內存大小
);
ivars(實例變量列表)
;
methodLists(方法列表)
;
cache(緩存)
;
protocols(實現的協議列表)
;
當然也包括一個isa指針
,這說明Class
也是一個對象類型,所以我們稱之為類對象
,這里的isa指向的是元類對象(metaclass),元類中保存了創建類對象(Class)的類方法的全部信息。
以下圖中可以清楚的了解到OC對象、類、元類之間的關系:
從圖中可知:
對象的isa
指針指向類
,類對象
的isa指針指向元類
,元類對象
的isa指針指向根元類
,根元類
的isa指針指向他本身
,從而形成一個閉環。
元類(Meta Class):是一個類對象的類,即:Class的類,這里保存了類方法等相關信息。
我們再看一下類對象中存儲的方法
、屬性
、成員變量
等信息的結構體:
- objc_ivar_list
存儲了類的成員變量,可以通過object_getIvar
或class_copyIvarList
獲取;另外這兩個方法是用來獲取類的屬性列表的class_getProperty
和class_copyPropertyLi