iOS面试剖析

OC对象的本质

2020-08-13  本文已影响0人  小溜子

一、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的值
922910-7d5f8caadf6a8169.png

它们有区别:

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.实例对象存储实际的值可以有很多,类对象和元类对象内存中只存在一份

上一篇下一篇

猜你喜欢

热点阅读