• 一个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

            

        }

  • 相关阅读:
    高并发系统设计思考笔记
    面试突击74:properties和yml有什么区别?
    面试突击86:SpringBoot 事务不回滚?怎么解决?
    面试突击82:SpringBoot 中如何操作事务?
    面试突击75:SpringBoot 有几种读取配置文件的方法?
    面试突击81:什么是跨域问题?如何解决?
    面试突击73:IoC 和 DI 有什么区别?
    面试突击85:为什么事务@Transactional会失效?
    一文快速上手 Nacos 注册中心+配置中心!
    面试突击72:输入URL之后会执行什么流程?
  • 原文地址:https://www.cnblogs.com/huangzs/p/7574180.html
Copyright © 2020-2023  润新知