今天记录一下它的底层运作。
       1: 类Class:
       typedef struct objc_class * Class;
     从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢?

struct objc_class
{
struct objc_class* isa;
struct objc_class* super_class;  //root的为null
const char* name;
long version;
long info;
long instance_size;
struct objc_ivar_list* ivars;
struct objc_method_list** methodLists;  //方法列表
struct objc_cache* cache;     //缓存最近使用的方法,以提高效率;
struct objc_protocol_list* protocols;
};
      为什么Class的第一个成员也是Class呢,它的内存布局岂不是和底下的object一样了?其实这就是类对象(class object)与实例对象(instance object)的区别了。
     Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).
  
     2:对象id:

typedef struct objc_object {
Class isa;
} *id;

可以发现, id可以用来表示任意一个对象,它是一个 objc_object 结构类型的指针,其第一个成员是一个 objc_class 结构类型的指针。
    我们的根类NSObject也同样是只有一个Class成员:
   @interface NSObject <NSObject> {
       Class       isa;
    }
    这个isa到底是什么呢?官方介绍是这样的:
    Every object is connected to the run-time system through its isa instance variable, inherited from the NSObject class. isa identifies the object's class; it points to a structure that's compiled from the class definition. Through isa, an object can find whatever information it needs at run timesuch as its place in the inheritance hierarchy, the size and structure of its instance variables, and the location of the method implementations it can perform in response to messages.
    可见,一个对象(Object)的isa指向了这个对象的类(Class),而这个对象的类(Class)的isa指向了metaclass。这样我们就可以找到静态方法和变量了。

3: 运行时: 
     Objective-C的运行时是动态的,它能让你在运行时为类添加方法或者去除方法以及使用反射。这在其它语言是不多见的。

类的实例对象的 isa 指向它的类;类的 isa 指向该类的 metaclass;
类的 super_class 指向其父类,如果该类为根类则值为 NULL;
metaclass 的 isa 指向根 metaclass,如果该 metaclass 是根 metaclass 则指向自身;
metaclass 的 super_class 指向父 metaclass,如果该 metaclass 是根 metaclass 则指向该 metaclass 对应的类;
     Object-C 为每个类的定义生成两个 objc_class ,一个普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass将 class 注册到运行时系统中,以此实现动态地创建一个新的类。

转载于:https://www.cnblogs.com/ChrisYu/p/4649979.html

Object-C 类,对象,运行时,isa相关推荐

  1. 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)

    本文旨在总结iOS知识网络,知识点,该知识网络罗列出常见UIKit.Foundation的对象特点和一些使用经验,可以看成是一本书:文本编辑采用树的形式,对知识点进行罗列,并标注一些使用经验(★)希望 ...

  2. redis python 出错重连_python穿透类 对象代理

    # coding:utf-8 import os import logging # 对象代理 # 用于解决需要在包调用与业务代码之间增加一些其他操作的场景 # 比如:应用程序中使用redis包对象,我 ...

  3. 高效 OC开发之对象、消息、运行时

    ⑥ 理解属性的概念 想必你曾经也这样为某个类添加成员变量: @interface Person : NSObject { @publicNSString *_firstName;NSString *_ ...

  4. crt 运行时库dll跨模块传递crt对象,出现的崩溃问题

    参考链接: https://blog.csdn.net/weixin_30653097/article/details/96512399 (讲述了,运行时库在启动的时候在exe或dll入口点之前就使用 ...

  5. iOS class深入理解: 实例对象、类对象、元类和isa指针

    你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...

  6. JAVA类运行时,报错“Error occurred during initialization of boot layer”

    JAVA类运行时,报错"Error occurred during initialization of boot layer" 网上查原因是由于JDK9及以上版本引入了模块,所以在 ...

  7. 无法从共享目录中映射段 linux,dopen():未作为root用户运行时,“无法从共享对象映射段”...

    我正在尝试在自制的Yocto Linux下加载一些自行编写的库. 当以root身份运行同一程序,但不能以另一个后来添加的用户身份运行该程序时,它运行良好.for () { m_HModule = dl ...

  8. C# 类对象数据存储(Object自定义序列化)

    获取Object对象的所有成员变量: FieldInfo[] fields = obj.GetType().GetFields(); // obj可以为任意类型对象 获取变量名称: string na ...

  9. 【IOS 开发】Object - C 面向对象 - 类 , 对象 , 成员变量 , 成员方法

    . 一. 类定义 类定义需要实现两部分 : -- 接口部分 : 定义类的成员变量和方法, 方法是抽象的, 在头文件中定义; -- 实现部分 : 引入接口部分的头文件, 实现抽象方法; 1. 接口部分定 ...

最新文章

  1. 【转】android是32-bit系统还是64-bit系统
  2. ESXI设备开机自启动虚拟机
  3. oh-my-zsh 功能收集
  4. Python操作JSON和CSV
  5. c#子线程和主线程创建窗体时顶层显示的区别
  6. 你以后会不会有小三?
  7. sql server限制查询条数_18. Django 2.1.7 查询集 QuerySet
  8. 【多线程学习第一弹】支持value重复的双向Map
  9. rabbitmq-server 安装方法
  10. 2018.9.18opencv3.4.1 + vs 2017 community +win 10 x64+cmake 3.11.3终终终章!
  11. 怎么样装mysql_如何安装MySQL数据库
  12. 从今天起,我不再使用 Java Date了!
  13. JOIN查询流程与驱动表
  14. 为 SmartDNS 配置广告过滤
  15. springboot实现上传图片添加水印
  16. 韩昊 20190919-1 每周例行报告
  17. java代码实现乘法口诀表
  18. python大侠个人信息查询_个人信息查询,教你怎么调查一个人的资料
  19. 软考(14)-接入网技术-sonet/sdh
  20. 【Linux】awk文本替换

热门文章

  1. C语言二月天数计算,关于计算两个日期间天数的代码,大家来看看
  2. 电脑技巧:Win10自带存储感知功能给电脑磁盘瘦身
  3. 数据库系统故障相关知识笔记
  4. 盘点最经典的外包案例
  5. 程序员爱护自己身体的几点建议
  6. 重磅!GitHub官方App官宣发布了
  7. 盘点十个超级实用的 JS 特性
  8. C#判断某天是否是周末或者节假日示例
  9. 【原创】关于ASP.NET WebForm与ASP.NET MVC的比较
  10. 野火linux底板设计,野火STM32F767套件(底板+核心板)