美文网首页
iOS中的isa指针

iOS中的isa指针

作者: 懒懒的猫 | 来源:发表于2021-07-28 18:31 被阅读0次

OC 中有 3种对象,分别是 实例对象instance、类对象class object、元类对象metaclass

instance对象实例

我们经常使用id来声明一个对象,那id的本质又是什么呢?打开#import<objc/objc.h>文件,可以发现以下几行代码

typedef struct objc_class *Class;

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

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

我们创建的一个对象或实例其实就是一个struct objc_object结构体,而我们常用的id也就是这个结构体的指针。
这个结构体只有一个成员变量,这是一个Class类型的变量isa,也是一个结构体指针,那这个指针又指向什么呢?
答案是:面向对象中每一个对象都必须依赖一个类来创建,因此对象的isa指针就指向对象所属的类。

class object(类对象)/metaclass(元类)

继续查看结构体objc_class的定义

struct objc_class {
    Class isa  OBJC_ISA_AVAILABILITY;

#if !__OBJC2__
    Class super_class                                        OBJC2_UNAVAILABLE;
    const char *name                                         OBJC2_UNAVAILABLE;
    long version                                             OBJC2_UNAVAILABLE;
    long info                                                OBJC2_UNAVAILABLE;
    long instance_size                                       OBJC2_UNAVAILABLE;
    struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
    struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
    struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
    struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
#endif

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

struct objc_classs结构体里存放的数据称为元数据(metadata),通过成员变量的名称我们可以猜测里面存放有指向父类的指针、类的名字、版本、实例大小、实例变量列表、方法列表、缓存、遵守的协议列表等,这些信息就足够创建一个实例了,该结构体的第一个成员变量也是isa指针,这就说明了Class本身其实也是一个对象,我们称之为类对象。

agduy-cw52a.jpeg

放一张大神的图,我们可以清楚的看到,实例对象的isa 指向类对象,类对象的isa 指向元类对象。而元类对象的isa都指向根元类。也就是 NSObject 元类。

如果我们想获取isa指针的指向对象要怎么获得

OBJC_EXPORT BOOL class_isMetaClass(Class cls) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);

OBJC_EXPORT Class object_getClass(id obj) 
    OBJC_AVAILABLE(10.5, 2.0, 9.0, 1.0);

class_isMetaClass用于判断Class对象是否为元类,object_getClass用于获取对象的isa指针指向的对象。

相关文章

  • 4-1 内存管理

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

  • iOS中的isa指针

    什么是isa OC是一门面向对象的语言,每一个对象都是类的一个实例,在OC语言内部,每一个对象都有一个isa指针,...

  • iOS中的isa指针

    isa:是一个Class 类型的指针. 每个实例对象有个isa的指针,他指向对象的类,而Class里也有个isa的...

  • IOS - 64位中 isa 区域的变化

    原文链接 不再是指针的 isa 在 iOS arm64 的架构中,属于 Objective-C 对象的 isa 空...

  • iOS底层之类的重要组成部分-isa结构体分析

    前言 iOS中每个OC对象都有一个isa指针,那么这个isa指针又是什么呢,里面都有什么信息呢?接下来让我们一起探...

  • iOS底层之isa走位探索

    前置文章: iOS底层之类的重要组成部分-isa结构体分析 前言 从上篇文章中我们得知对象的isa指针中的shif...

  • iOS isa指针

    isa 指针,表示这个对象是一个什么类。而 Class 类型, 也就是 struct objc_class * ,...

  • iOS isa指针

    在Objective-C中,任何类的定义都是对象。类和类的实例没有任何本质上的区别。任何对象都有isa指针。 is...

  • iOS - isa指针

    [toc] 参考 isa指针 isa 简介 isa (is a kind of) 是一个 Class 类型的指针,...

  • iOS ISA指针

    https://opensource.apple.com/tarballs/objc4/[https://open...

网友评论

      本文标题:iOS中的isa指针

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