一、OC对象的底层实现
OC 中的代码在底层实现,使用的是 C、C++,所以要研究 OC 中的类结构,可以将 OC 的代码转成 C++的代码。
//OC
@interface NSObject{
Class isa; // 包含一个isa指针
}
// 对应的 C
struct NSObject_IMPL{
Class isa;
}
其中 Class 的定义如下:
typedef struct objc_class *Class;
二、OC对象的分类
OC对象分为三类:实例对象、类对象、元类对象
我们知道实例对象是通过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的值
它们有区别:
1.内存中可以有多个实例对象,他们维护着自己的成员变量的值
2.内存中只需要有一个相应的类对象,由它去维护公共的信息
它们所存储信息:
实例对象在内存中存储的信息主要包括
1. isa指针
2. 其他成员变量
类对象在内存中存储的信息主要包括
1. isa指针
2. superclass指针
3. 类的属性信息
4. 类的对象方法信息
5. 类的协议信息
6. 类的成员变量信息
7. 其他信息
3.类对象与元类对象
类对象存储的是实例对象的公共信息,元类对象存储的就是类对象的信息,它的数据结构与类对象一致,只是用途不一样
元类对象在内存中存储的信息,如下:
类的类方法信息
类对象、元类对象的获取方式
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.实例对象存储实际的值可以有很多,类对象和元类对象内存中只存在一份