OC对象的本质

一、OC对象的底层实现

Objective-C 底层是由C/C++的数据结构实现的。
一个NSObject类对应C中的结构体类型

//OC
@interface NSObject{
  Class isa; // 包含一个isa指针
}
// 对应的 C
struct NSObject_IMPL{
  Class isa;
}
// isa 本质就是一个指向 objc_class 结构体的指针
typedef struct objc_class *Class;

注意:isa的内存地址一直都在对象的起始位置,所以isa 的内存地址就是对象的内存地址,而isa中存放的地址值并不是对象本身的地址,切勿混淆!!!

二、OC对象的分类

OC对象分为三类:实例对象、类对象、元类对象

1.类对象、实例对象

实例对象是通过类alloc init出来的对象

/*
   NSObject 类对象
   objc1 实例对象
   objc2 实例对象
*/
NSObject *obj1 = [[NSObject alloc] init]; 
NSObject *obj2 = [[NSObject alloc] init]; 

思考:作为实例对象,它在内存中都存储了哪些信息,它与类对象有什么区别?

我们可以通过初始化方法创建很多个实例对象,而实例对象与实例对象之间的关系
1.都具有isa指针,isa的地址值不同
1.他们的成员变量类型相同,而值可以不同
2.具有相同的方法

@interface Person:NSObject{
  int age;

-(void)getAge;
}

Person *p1 = [[Person alloc] init]; // 实例对象p1具有自己的内存空间
p1.age = 3; 
[p1 getAge]; // 调用方法获取age的值
Person *p2 = [[Person alloc] init];// p2也具有自己的内存空间
p1.age = 4;
[p2 getAge]; // 滴啊用方法获取age的值
image.png

1.内存中可以有多个实例对象,他们维护着自己的成员变量的值
2.内存中只需要有一个相应的类对象,由它去维护公共的信息
因此

实例对象在内存中存储的信息主要包括

1. isa指针
2. 其他成员变量

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

1. isa指针
2. superclass指针
3. 类的属性信息
4. 类的对象方法信息
5. 类的协议信息
6. 类的成员变量信息
7. 其他信息

2.类对象与元类对象

类对象存储的是实例对象的公共信息,元类对象存储的就是类对象的信息,它的数据结构与类对象一致,只是用途不一样

元类对象在内存中存储的信息

类的类方法信息

类对象、元类对象的获取方式

NSObject *obj = [[NSObject alloc] init];
Class obj_class = [obj class]; // 返回类对象
Class obj_class2 = [NSObject class]; // 类对象直接调用class方法
//class 方法是oc的方法,重复调用此方法,返回的只是类对象
Class obj_class_class = [[NSObject class] class]; //无论调用多少次,返回的依然是类对象
// objec_getClass方法会根据传入的参数类型,返回类对象或者是元类对象
Class obj_class3 = object_getClass(obj); // runtime api 返回类对象
Class objc_class4 = object_getClass(obj_class);// 返回的是元类对象

三、总结

1.oc底层是由c/c++实现
2.oc对象分为三类:实例对象、类对象、元类对象
3.实例对象存储实际的值可以有很多,类对象和元类对象内存中只存在一份

思考:isa究竟是什么,在对象中起着什么样的作用,它的内部结果是什么样子的?

isa的作用与内部结构(上)
isa的作用与内部结构(下)

你可能感兴趣的:(OC对象的本质)