isa指針

一.isa指針

要認識什么是isa指針,我們得先明確一點:

在Objective-C中,任何類的定義都是對象。類和類的實例(對象)沒有任何本質上的區別。任何對象都有isa指針。

那么什么是類呢?在xcode中用快捷鍵Shift+Cmd+O 打開文件objc.h 能看到類的定義:

#if !OBJC_TYPES_DEFINED
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;//這邊說明Class也是一個對象(objc_class *)

/// Represents an instance of a class.
struct objc_object {
    Class isa  OBJC_ISA_AVAILABILITY;
};

/// A pointer to an instance of a class.
typedef struct objc_object *id;
#endif

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

#endif

可以看出:

Class 是一個 objc_class 結構類型的指針, id是一個 objc_object 結構類型的指針.

稍微解釋一下各個參數的意思:

isa:是一個Class 類型的指針. 每個實例對象有個isa的指針,他指向對象的類,而Class里也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調用時,先會從本身查找類方法的實現,如果沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass).根元類的isa指針指向本身,這樣形成了一個封閉的內循環。

  • super_class:父類,如果該類已經是最頂層的根類,那么它為NULL。

  • version:類的版本信息,默認為0

  • info:供運行期使用的一些位標識。

  • instance_size:該類的實例變量大小

  • ivars:成員變量的數組

再來看看各個類實例變量的繼承關系:

每一個對象本質上都是一個類的實例。其中類定義了成員變量和成員方法的列表。對象通過對象的isa指針指向類。

每一個類本質上都是一個對象,類其實是元類(meteClass)的實例。元類定義了類方法的列表。類通過類的isa指針指向元類。

所有的元類最終繼承一個根元類,根元類isa指針指向本身,形成一個封閉的內循環。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,789評論 0 9
  • 一,認識isa指針 首先我們要明確一點:在OC中,任何類的定義都是對象,類和類的實例在本質上沒有區別,任何對象都有...
    舒城8中閱讀 2,259評論 0 7
  • 每個Objective-C對象都有一個隱藏的數據結構,這個數據結構是Objective-C對象的第一個成員變量,它...
    shenhaieyu閱讀 2,379評論 1 51
  • Objective-C語言是一門動態語言,它將很多靜態語言在編譯和鏈接時期做的事放到了運行時來處理。這種動態語言的...
    有一種再見叫青春閱讀 612評論 0 3
  • 1. 我喜歡逛商城,城西銀泰在打折,我興高采烈地去了。 逛了一圈,發現沒有什么好逛的,雖然店員都很熱情,許多商品都...
    晴風秋末燕歸來閱讀 270評論 2 0