OC的类信息存放在哪里,看完千万别说还不知道

简介: 这篇行文主要介绍OC的类信息具体存放在哪个位置。在了解这个之前,要先明白 Objective-C中的对象(后称OC对象),主要可以分为哪几种,如下:1、instance对象(实例对象)2、class对象(类对象)-https://so.csdn.net/so/search?q=%E7%B1%BB%E5%AF%B9%E8%B1%A1&spm=1001.2101.3001.70203、meta-class对象(元类对象)

一、instance对象(实例对象)


instance 对象:就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象。


示例一:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *object1 = [[NSObject alloc] init];
        NSObject *object2 = [[NSObject alloc] init];
        NSLog(@"%p %p",
              object1,
              object2);
    }
    return 0;
}


object1、object2 是 NSObject 的 instance 对象(实例对象)。

它们是不同的两个对象,分别占据着两块不同的内存。


示例二:03797e4de39d4c228faf6b61aef4e3bd.png


结构分析:

5d3abe1d5e254de18ae79a33c3096869.png


instance对象在内存中存储的信息包括:


isa指针

其他成员变量


二、class对象(类对象)


#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *object1 = [[NSObject alloc] init];
        NSObject *object2 = [[NSObject alloc] init];
        Class objectClass1 = [object1 class];
        Class objectClass2 = [object2 class];
        Class objectClass3 = object_getClass(object1);
        Class objectClass4 = object_getClass(object2);
        Class objectClass5 = [NSObject class];
        NSLog(@"%p %p",
              object1,
              object2);
        NSLog(@"%p %p %p %p %p",
              objectClass1,
              objectClass2,
              objectClass3,
              objectClass4,
              objectClass5);
    }
    return 0;
}


objectClass1 ~ objectClass5都是NSObject的class对象(类对象)

它们是同一个对象。每个类在内存中有且只有一个class对象。


class对象在内存中存储的信息主要包括:


isa指针

superclass指针

类的属性信息(@property)

类的对象方法信息(instance method)

类的协议信息(protocol)

类的成员变量信息(ivar)


三、meta-class对象(元类对象)


Class objectMetaClass = object_getClass([NSObject class]);
NSObject *object1 = [[NSObject alloc] init];
Class objectClass1 = [object1 class];
Class objectMetaClass = object_getClass(objectClass1);


objectMetaClass是NSObject的meta-class对象(元类对象)

每个类在内存中有且只有一个meta-class对象


注意:meta-class对象和class对象的内存结构是一样的,但是用途不一样。


在内存中存储的信息主要包括:


isa指针

superclass指针

类的类方法信息(class method)


四、总结


#import <Foundation/Foundation.h>
#import <objc/runtime.h>
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // instance对象,实例对象
        NSObject *object1 = [[NSObject alloc] init];
        NSObject *object2 = [[NSObject alloc] init];
        // class对象,类对象
        Class objectClass1 = [object1 class];
        Class objectClass2 = [object2 class];
        Class objectClass3 = object_getClass(object1);
        Class objectClass4 = object_getClass(object2);
        Class objectClass5 = [NSObject class];
        // class方法返回的一直是class对象,类对象
       // Class objectMetaClass2 = [[[NSObject class] class] class];
        // meta-class对象,元类对象
        // 将类对象当做参数传入,获得元类对象
        Class objectMetaClass = object_getClass(objectClass5);
        NSLog(@"instance - %p %p",
              object1,
              object2);
        NSLog(@"class - %p %p %p %p %p %d",
              objectClass1,
              objectClass2,
              objectClass3,
              objectClass4,
              objectClass5,
              class_isMetaClass(objectClass3));
        NSLog(@"objectMetaClass - %p %d", objectMetaClass, class_isMetaClass(objectMetaClass));
    }
    return 0;
}


拓展:


1、Class objc_getClass(const char *aClassName)


1> 传入字符串类名

2> 返回对应的类对象


2、Class object_getClass(id obj)


1> 传入的obj可能是instance对象、class对象、meta-class对象

2> 返回值

a) 如果是instance对象,返回class对象

b) 如果是class对象,返回meta-class对象

c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象


3、- (Class)class、+ (Class)class


1> 返回的就是类对象


- (Class) {
    return self->isa;
}
+ (Class) {
    return self;
}


4、OC的类信息存放在哪里?


1、对象方法、属性、成员变量、协议信息,存放在class对象中。

2、类方法,存放在meta-class对象中。

3、成员变量的具体值,存放在instance对象。


相关文章
|
算法 网络虚拟化 内存技术
408王道计算机组成原理强化——存储系统大题
408王道计算机组成原理强化——存储系统大题(下)
2839 2
408王道计算机组成原理强化——存储系统大题
|
5月前
|
开发工具 Android开发 iOS开发
如何在Android Studio中配置Flutter环境?
如何在Android Studio中配置Flutter环境?
1180 61
|
数据采集 测试技术
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
本文讨论了在使用Selenium和WebDriver自动化测试时常见的执行格式错误(Errno 8 Exec format error)问题。错误通常发生在运行ChromeDriver时,与兼容性或路径配置有关。文章提供了多种解决方案,包括手动更改路径、更新或重新安装webdriver-manager包、下载特定版本的ChromeDriver、修改driver_cache.py文件。此外,还介绍了如何结合代理IP技术使用Selenium进行网页抓取,以提高效率和成功率。示例代码展示了如何配置代理IP并使用Selenium访问网站。通过这些方法,用户可以有效解决执行格式错误,并提高网页自动化测试
1260 1
Selenium与WebDriver:Errno 8 Exec格式错误的多种解决方案
|
11月前
配置MAC地址表
配置MAC地址表
136 2
配置MAC地址表
|
11月前
|
存储 编译器 C语言
【C语言】学生管理系统:完整模拟与实现(一)
【C语言】学生管理系统:完整模拟与实现
188 1
基于kalman滤波的UAV三维轨迹跟踪算法matlab仿真
本文介绍了一种使用卡尔曼滤波(Kalman Filter)对无人飞行器(UAV)在三维空间中的运动轨迹进行预测和估计的方法。该方法通过状态预测和观测更新两个关键步骤,实时估计UAV的位置和速度,进而生成三维轨迹。在MATLAB 2022a环境下验证了算法的有效性(参见附图)。核心程序实现了状态估计和误差协方差矩阵的更新,并通过调整参数优化滤波效果。该算法有助于提高轨迹跟踪精度和稳定性,适用于多种应用场景,例如航拍和物流运输等领域。
821 12
|
11月前
|
前端开发 JavaScript
一文详解React事件中this指向,面试必备
一文详解React事件中this指向,面试必备
195 0
|
存储 前端开发 JavaScript
44 个 React 前端面试问题
【8月更文挑战第18天】
173 2
|
Perl
解决Cocoapods重装或更新后版本不生效的问题
解决Cocoapods重装或更新后版本不生效的问题
405 1
|
自然语言处理 编译器 开发者