Swift教程

iOS 底层 - 类的本质与方法缓存

本文主要是介绍iOS 底层 - 类的本质与方法缓存,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

前言

想要学好一个方向的编程语言,底层基础一定是个必不可少的前提。而在 Objective-C 这个篇章中,类与对象更是基础中的基础,它是能让我们串联起万物的基石。

因此,本篇文章就来好好探索一下 类的本质类的结构类的懒加载概念 以及 从编译时到运行时 到底做了什么事情,来彻底的了解一下它 。

源码准备

前导知识

什么是类

Objective-C 是一门面向对象的编程语言。每个对象都是其 的实例 , 被称为实例对象 . 每一个对象都有一个名为 isa 的指针,指向该对象的类。

而类本身也是一个对象。为什么这么说呢?

来看下源码

typedef struct objc_object *id;
typedef struct objc_class *Class;

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;             // formerly cache pointer and vtable
    class_data_bits_t bits;    // class_rw_t * plus custom rr/alloc flags
    /**/
}

struct objc_object {
private:
    isa_t isa;
public:
    // ISA() assumes this is NOT a tagged pointer object
    Class ISA();

    // getIsa() allows this to be a tagged pointer object
    Class getIsa();
    /*...*/
}
复制代码

首先,对象是一个 id 类型 , 也就是一个指向 objc_object 结构体的指针。而我们看到 Class 是一个指向 objc_class 结构体指针,而 objc_class 继承于 objc_object , 因此,我们说 类也是一个对象

其实 对象是类的实例,而类是由元类对象的实例,实例方法存储在类中,同样,类方法则存储在元类中。同样我们可以得出结论:Objective-C 对象都是 C 语言结构体实现的

总结

  • Objective-C 中,每个对象 ( 其根本是一个 objc_object 结构体指针 ) 都有一个名为 isa 的指针,指向该对象的类 ( 其根本是一个 objc_class 结构体 )

  • 每一个类实际上也是一个对象 ( 因为 objc_class 继承与 objc_object),因此每一个类也可以接受消息,即调用类方法,而接受者就是类对象 isa 所指向的元类。

  • NSObjectNSProxy 是两个基类,他们都遵循了 <NSObject> 协议,以此为其继承的子类提供了公共接口和能力。

类的结构

提示 :

OBJC2 中 以下 objc_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;
复制代码

类的结构体源码如下 :

typedef struct objc_class *Class;

struct objc_class : objc_object {
    // Class ISA;
    Class superclass;
    cache_t cache;
                    
这篇关于iOS 底层 - 类的本质与方法缓存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!