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

            

        }

  • 相关阅读:
    robots.txt
    procdump和mimikatz工具配合破解windows账户口令
    通过vbs脚本控制方向盘按键
    批处理删除文件或文件夹代码
    彩色线条雨特效html代码
    secureCRT
    chrome 更新flash插件
    python命令行下安装redis客户端
    FastJson使用
    Redis 学习(二)
  • 原文地址:https://www.cnblogs.com/huangzs/p/7574180.html
Copyright © 2011-2022 走看看