OC-底層實現isa指針

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
/// A pointer to an instance of a class.
typedef struct objc_object *id;
  • Class是一個指向objc_class(類)結構體的指針,而id是一個指向objc_object(對象)結構體的指針。
  • objc_object(對象)isa指針指向的類結構稱為objec_class(該對象的類),其中存放著普通成員變量與對象方法 (“-”開頭的方法)。
  • objc_class(類)中isa指針指向的類結構稱為metaclass(該類的元類),其中存放著static類型的成員變量與static類型的方法 (“+”開頭的方法)。
/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};
  • objc_objct(對象)結構體中只有isa一個成員屬性,指向objc_class(該對象的類)。
struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;   //isa指針,指向metaclass(該類的元類)
    
#if !__OBJC2__
    
    Class super_class   //指向objc_class(該類)的super_class(父類)
    
    const char *name    //objc_class(該類)的類名
    
    long version        //objc_class(該類)的版本信息,初始化為0,可以通過runtime函數class_setVersion和class_getVersion進行修改和讀取
    
    long info           //一些標識信息,如CLS_CLASS表示objc_class(該類)為普通類。ClS_CLASS表示objc_class(該類)為metaclass(元類)
    
    long instance_size  //objc_class(該類)的實例變量的大小
    
    struct objc_ivar_list *ivars    //用于存儲每個成員變量的地址
    
    struct objc_method_list **methodLists   //方法列表,與info標識關聯
    
    struct objc_cache *cache        //指向最近使用的方法的指針,用于提升效率
    
    struct objc_protocol_list *protocols    //存儲objc_class(該類)的一些協議
#endif
    
} OBJC2_UNAVAILABLE;

  • objc_class(類)objc_object(對象)的結構體中多了很多成員,上面就是介紹各個成員的作用。

值得注意的是:


  • 所有的metaclass(元類)isa指針都是指向根metaclass(元類),而根metaclass(元類)isa指針則指向自身。
  • 根metaclass(元類)中的superClass指針指向根類,因為根metaclass(元類)是通過繼承根類產生的。

作用:


  • 當我們調用某個對象的對象方法時,它會首先在自身isa指針指向的objc_class(類)methodLists中查找該方法,如果找不到則會通過objc_class(類)super_class指針找到其父類,然后從其methodLists中查找該方法,如果仍然找不到,則繼續通過 super_class向上一級父類結構體中查找,直至根class;
  • 當我們調用某個類方法時,它會首先通過自己的isa指針找到metaclass(元類),并從其methodLists中查找該類方法,如果找不到則會通過metaclass(元類)super_class指針找到父類的metaclass(元類)結構體,然后從methodLists中查找該方法,如果仍然找不到,則繼續通過super_class向上一級父類結構體中查 找,直至根metaclass(元類);
  • 這里有個細節就是要說運行的時候編譯器會將代碼轉化為objc_msgSend(obj, @selector (makeText)),在objc_msgSend函數中首先通過obj(對象)isa指針找到obj(對象)對應的class(類)。在class(類)中先去cache中通過SEL(方法的編號)查找對應method(方法),若cache中未找到,再去methodLists中查找,若methodists中未找到,則去superClass中查找,若能找到,則將method(方法)加入到cache中,以方便下次查找,并通過method(方法)中的函數指針跳轉到對應的函數中去執行。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容