zoukankan      html  css  js  c++  java
  • 一个Objective-C对象如何进行内存布局?(考虑有父类的情况)

    1.对象isa指向类对象,类对象的isa指向元类。元类isa指向根元类。根元类的isa指针指向自己,superclass指针指向NSObject类

    2.实例对象结构体只有一个isa变量,指向实例对象所属的类。类对象有isa,superclass,方法,属性,协议列表,以及成员变量的描述。

    3.所有的对象调用方法都是一样的,没有必要存在对象中,对象可以有无数个,类对象就有一个所以只需存放在类对象中

        

     

    可以从官方objc.h源码里面找到实例定义

        /// Represents an instance of a class.

        struct objc_object {

            Class _Nonnull isa  OBJC_ISA_AVAILABILITY;

        };


    可以在runtime.h里面找到类对象的定义

        

        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

            

        }

  • 相关阅读:
    poj 3026 Borg Maze
    poj2828 Buy Tickets
    poj3264 Balanced Lineup
    高精度运算
    poj1035 Spell checker
    poj2318 TOYS 点积叉积理解
    求两直线交点的一般做法
    C语言I博客作业05
    C语言I博客作业04
    C语言I博客作业07
  • 原文地址:https://www.cnblogs.com/huangzs/p/7574180.html
Copyright © 2011-2022 走看看