Objective-C底层数据结构

Objective-C底层数据结构

Objective-C底层数据结构

类的数据结构

Class(指针)

typedef struct objc_class *Class;

/*
  这是由编译器为每个类产生的数据结构,这个结构定义了一个类.这个结构是通过编译器在执行时产生,在运行时发送消息时使用.因此,一些成员改变了类型.编译器产生"char* const"类型的字符串指针替代了下面的成员变量"super_class"
*/
struct objc_class {
  struct objc_class*  class_pointer;    /* 指向元类的指针. */
  struct objc_class*  super_class;      /* 指向父类的指针. 对于NSObject来说是NULL.*/
  const char*         name;             /* 类的名称. */
  long                version;          /* 未知. */
  unsigned long       info;             /* 比特蒙板.  参考下面类的蒙板定义. */
  long                instance_size;    /* 类的字节数.包含类的定义和所有父类的定义 */
#ifdef _WIN64
  long pad;
#endif
  struct objc_ivar_list* ivars;         /* 指向类中定义的实例变量的列表结构. NULL代表没有实例变量.不包括父类的变量. */
  struct objc_method_list*  methods;    /* 链接类中定义的实例方法. */
  struct sarray *    dtable;            /* 指向实例方法分配表. */
  struct objc_class* subclass_list;     /* 父类列表 */
  struct objc_class* sibling_class;
  struct objc_protocol_list *protocols; /* 要实现的原型列表 */
  void* gc_object_type;
};

Method(指针)

typedef struct objc_method *Method;

/* 编译器依据类中定义的方法为该类产生一个或更多这种这种结构.
    一个类的实现可以分散在一个文件中不同部分,同时类别可以分散在不同的模块中.为了处理这个问题,使用一个单独的方法链表 */
struct objc_method
{
  SEL         method_name;  /* 这个变量就是方法的名称.编译器使用在这里使用一个`char*`,当一个方法被注册,名称在运行时被使用真正的SEL替代  */
  const char* method_types; /* 描述方法的参数列表. 在运行时注册选择器时使用.那时候方法名就会包含方法的参数列表.*/
  IMP         method_imp;   /* 方法执行时候的地址. */
};

Ivar(指针)

typedef struct objc_ivar *Ivar;

/* 编译器依据类中定义的实例变量为该类产生一个或更多这种这种结构  */
struct objc_ivar
{
  const char* ivar_name;  /* 类中定义的变量名. */
  const char* ivar_type;  /* 描述变量的类型.调试时非常有用. */
  int        ivar_offset; /* 实例结构的基地址偏移字节 */
};

Category(指针)

typedef struct objc_category *Category;

/* 编译器为每个类别产生一个这样的结构.一个类可以具有多个类别同时既包括实例方法,也可以包括类方法*/
struct objc_category
{
  const char*   category_name;                /* 类别名.定义在类别后面的括号内*/
  const char*   class_name;                   /* 类名 */
  struct objc_method_list  *instance_methods; /* 链接类中定义的实例方法. NULL表示没有实例方法. */
  struct objc_method_list *class_methods;     /* 链接类中定义的类方法. NULL表示没有类方法. */
  struct objc_protocol_list *protocols;       /* 遵循的协议表  */
};

objc_property_t

typedef struct objc_property *objc_property_t;

IMP

id (*IMP)(id, SEL, ...)

SEL

typedef struct objc_selector *SEL;

struct objc_selector
{
  void *sel_id;
  const char *sel_types;
};

objc_method_list

struct objc_method_list
{
  struct objc_method_list*  method_next; /* 这个变量用来链接另一个单独的方法链表 */
  int            method_count;            /* 结构中定义的方法数量 */
  struct objc_method method_list[1];      /* 可变长度的结构 */
};

objc_cache

struct objc_cache
{
    unsigned int mask;
    unsigned int occupied;
    Method buckets[1];
};

objc_protocol_list

struct objc_protocol_list
{
  struct objc_protocol_list *next;
  size_t count;
  struct objc_protocol *list[1];
};

实例的数据结构

id

typedef struct objc_object *id;

objc_object

struct objc_object
{
  /* 类的指针是对象相关的类.如果是一个类对象, 这个指针指向元类.
  Class isa;
};

objc_super

struct objc_super
{
  id    self;        /* 消息的接受者  */
  Class super_class; /* 接受者的父类  */
};

← 上一篇

时间: 2024-10-12 21:33:01

Objective-C底层数据结构的相关文章

[转]java 的HashMap底层数据结构

java 的HashMap底层数据结构 HashMap也是我们使用非常多的Collection,它是基于哈希表的 Map 接口的实现,以key-value的形式存在.在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存.取value.下面就来分析HashMap的存取. 一.定义 HashMap实现了Map接口,继承AbstractMap.其中Map接口定义了键映射到值的规则,而AbstractM

浅析Linux驱动模型中的底层数据结构kobject和kset

1.kobject Linux内核用kobject来表示一个内核对象.它和Sysfs文件系统联系密切,在内核中注册到系统中的每个kobject对象在sysfs文件系统中对对应着一个文件目录.kobject数据结构通常的用法是嵌入到其对他的数据结构中(即容器,比如cdev结构),用于实现内核对该类数据结构对象的管理.这些数据结构(容器)通过kobject连接起来,形成了一个树状结构. 它在源码中的定义为: /*<include/linux/kobject.h>*/ struct kobject

C#中经常使用容器的使用与底层数据结构

从使用的频率一个个来简单说一下. Array/ArrayList/List/LinkedList Array 数组在C#中最早出现的.在内存中是连续存储的,所以它的索引速度非常快,并且赋值与改动元素也非常easy. string[] s=new string[2]; //赋值 s[0]="a"; s[1]="b"; //改动 s[1]="a1"; 可是数组存在一些不足的地方.在数组的两个数据间插入数据是非常麻烦的,并且在声明数组的时候必须指定数组

STL底层数据结构

STL底层数据结构 1.vector 底层数据结构为数组 ,支持快速随机访问 2.list 底层数据结构为双向链表,支持快速增删 3.deque 底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 4.stack 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 5.queue 底层一般用list或deque实现,封闭头部即可,不用vector的原因应该是容量大小有限制, 扩容

验证list的底层数据结构

<STL源码剖析>中,指出SGI STL的list底层数据结构式循环双向链表,并且在链表尾端留一个空白节点,让end指向它.由于是双向的,那么list的迭代器必须是Bidirectional Iterator类别的. 下面,分别验证vs2010下和code blocks(gcc)下,list的底层实现是否是循环链表. #include<list> #include<iostream> using namespace std; int main(){ list<in

STL底层数据结构实现

C++ STL 的实现: 1.vector      底层数据结构为数组 ,支持快速随机访问 2.list            底层数据结构为双向链表,支持快速增删 3.deque       底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 deque是一个双端队列(double-ended queue),也是在堆中保存内容的.它的保存形式如下: [堆1] --> [堆2] -->[堆3] --> ... 每个堆保存

STL实现的底层数据结构简介

STL实现的底层数据结构简介 C++ STL 的实现: 1.vector  底层数据结构为数组 ,支持快速随机访问 2.list    底层数据结构为双向链表,支持快速增删 3.deque   底层数据结构为一个中央控制器和多个缓冲区,详细见STL源码剖析P146,支持首尾(中间不能)快速增删,也支持随机访问 4.stack   底层一般用23实现,封闭头部即可,不用vector的原因应该是容量大小有限制,扩容耗时 5.queue   底层一般用23实现,封闭头部即可,不用vector的原因应该

Redis 概念以及底层数据结构

Redis 简介REmote DIctionary Server(Redis) 是一个由SalvatoreSanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型. R

深入理解Mysql索引底层数据结构与算法

深入理解Mysql索引底层数据结构与算法 ----->之前很多人还问我一些关于mysql索引的底层和使用,我就特意写一篇文章跟大家一起分享一下我对mysql索引的理解,大家有更深入的理解可以下面留言. 1.索引的定义 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构 大家使用索引有没有想过这个问题?为什么索引能够帮助mysql高效获取数据?我一一给大家道来!在给大家讲之前,先更大家分享一些计算机基础知识,有助于理解 我们都知道mysql数据是已文件的形式存储