1. 程式人生 > 實用技巧 >例項物件( instance)、類物件(class)、元類物件(meta-class)的內部結構分析

例項物件( instance)、類物件(class)、元類物件(meta-class)的內部結構分析

例項物件( instance)、類物件(class)、元類物件(meta-class)的內部結構分析

本文使用的objc原始碼版本為objc4-756.2

Class本質上為一個結構體型別

typedef struct objc_class *Class;

例項物件的定義

struct objc_object {
private:
    isa_t isa;    
    //以下省略是其他繼承新增成員變數
}

類物件/元類物件的定義

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             
// 方法快取 class_data_bits_t bits; // 類的具體資訊 class_rw_t *data() { return bits.data(); } //以下省略 } struct class_rw_t { // Be warned that Symbolication knows the layout of this structure. uint32_t flags; uint32_t version; const class_ro_t *ro; method_array_t methods;
//方法列表 property_array_t properties; //屬性資訊 protocol_array_t protocols; //協議列表 } struct class_ro_t { uint32_t flags; uint32_t instanceStart; uint32_t instanceSize; //instance物件佔用的記憶體大小 #ifdef __LP64__ uint32_t reserved; #endif const uint8_t * ivarLayout; const char
* name; //類名 method_list_t * baseMethodList; protocol_list_t * baseProtocols; const ivar_list_t * ivars; //成員變數列表 const uint8_t * weakIvarLayout; property_list_t *baseProperties; }

Xcode 裡面的runtime裡面的 API是已經廢棄瞭如下

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;

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

廢棄如下OBJC2_UNAVAILABLE;

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

} OBJC2_UNAVAILABLE;