iOS 底层 - 类的本质与方法缓存
2020/3/4 23:01:39
本文主要是介绍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
所指向的元类。
NSObject
与NSProxy
是两个基类,他们都遵循了<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 底层 - 类的本质与方法缓存的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-10-05Swift语法学习--基于协议进行网络请求
- 2022-08-17Apple开发_Swift语言地标注释
- 2022-07-24Swift 初见
- 2022-05-22SwiftUI App 支持多语种 All In One
- 2022-05-10SwiftUI 组件参数简写 All In One
- 2022-04-14SwiftUI 学习笔记
- 2022-02-23Swift 文件夹和文件操作
- 2022-02-17Swift中使用KVO
- 2022-02-08Swift 汇编 String array
- 2022-01-30SwiftUI3.0页面反向传值