美文网首页
iOS isa解析

iOS isa解析

作者: 楼上那只猫 | 来源:发表于2020-01-09 21:50 被阅读0次

在创建一个对象的时候,我们有时会用id来表示,系统会在运行时找到对象实际所属的类,这是怎么实现的呢?id又是什么?

/// A pointer to an instance of a class.
typedef struct objc_object *id;

/// Represents an instance of a class.
struct objc_object {
    Class _Nonnull isa  OBJC_ISA_AVAILABILITY;
};

可以看到,id实际是一个结构体指针,这个结构体中包含一个isa成员,类型为Class

每个对象都最终都继承于NSObject,通过点击NSObject,可以发现如下:

@interface NSObject <NSObject> {
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-interface-ivars"
    Class isa  OBJC_ISA_AVAILABILITY;
#pragma clang diagnostic pop
}

有一个isa成员变量,其类型是Class类型。
创建一个对象,就是对一个类进行实例化,因此需要知道类的模板,根据这个模板来创建实例对象,因此这个Class实际上就是表示类的模板,点击可以查看到实际是一个结构体。

/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class;
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

} OBJC2_UNAVAILABLE;
/* Use `Class` instead of `struct objc_class *` */

注意,这个结构体中也有一个是isa指针,因此可以判断Class其实也是一个对象,叫做类对象,也就是说,在创建类的实例对象的时候,实例对象的isa会指向对象所属类的类对象,这个类对象中包含创建实例所需的基本信息,包含方法列表,属性列表,协议列表等。
那么,类对象中的isa指向的是哪里?
可以看到,类对象中包含的是创建该类的实例对象所需的基本信息,并没包含创建类对象所需的信息,因此,类对象中的isa实际指向的是描述这个类对象的类,称为元类
元类中包含这个类对象的基本信息,类方法列表等信息。
元类中也有isa指针,元类中的isa指针指向根类。

相关文章

  • iOS isa解析

    在创建一个对象的时候,我们有时会用id来表示,系统会在运行时找到对象实际所属的类,这是怎么实现的呢?id又是什么?...

  • iOS源码解析:runtime<二> objc_ms

    iOS源码解析:runtime<一> isa,class底层结构窥探iOS方法调用的过程我们都很清楚,比如下面这个...

  • iOS Objective-C isa简介

    iOS Objective-C isa 1.isa简介 isa是 Objective—C 对象alloc的时候,伴...

  • iOS内存管理方案

    __x86_64__环境调试 TaggedPointer 解析 判断 取值 NONPOINTER_ISA 解析 判...

  • 4-1 内存管理

    1.内存布局 2.iOS内存管理方案 [isa指针保存了内存管理的信息] 2.iOS内存管理方案 [isa指针...

  • iOS Objective-C isa 走位分析

    iOS Objective-C isa 走位分析 1. 判断isa是对象的第一个属性 isa<-->cls的关联 ...

  • isa指针的作用

    原文:iOS面试题大全 对象的isa指向类,类的isa指向元类(meta class),元类isa指向元类的根类。...

  • isa结构解析

    1. isa初始化 在 iOS alloc原理分析 中会 initInstanceIsa中初始化isa,源码如下:...

  • iOS中isa面试相关知识解析

    前言 之前我们学习了类的相关知识和isa走位,为了加深印象,接下来我们通过两个例子来复习一下,这两个例子也是一下大...

  • iOS底层探索004-类分析

    iOS底层探索-目录 1. 类的分析 主要分析两个部分:isa的走向和继承关系 isa分析 类的isa走向,参考这...

网友评论

      本文标题:iOS isa解析

      本文链接:https://www.haomeiwen.com/subject/zmsyactx.html