Objective-C对象的分类与isa指针

2018-08-30  本文已影响7人  Y_van

OC对象的分类

Objective-C中的对象,简称OC对象,主要可以分为3种

instance

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

instance获取方式:

NSObjcet *object1 = [[NSObjcet alloc] init];
NSObjcet *object2 = [[NSObjcet alloc] init];
// 打印地址可发现分别占据着两块不同的内存

特性:object1和object2都是NSObject的instace对象(实例对象),
但他们是不同的两个对象,并且分别占据着两块不同的内存。

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

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

为什么所有成员变量里都有isa?

答,因为OC类都继承自NSObject

class对象

类对象特性:一个类的类对象是唯一的,在内存中是同一个的。

类对象获取方式:


Class objectClass1 = [object1 class];
Class objectClass2 = [object2 class];
Class objectClass3 = [NSObject class];

// runtime
Class objectClass4 = object_getClass(object1);
Class objectClass5 = object_getClass(object2);

//验证类对象是唯一的。存储的地址都是唯一的
NSLog(@"%p %p %p %p %p", objectClass1, objectClass2, objectClass3, objectClass4, objectClass5);

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

  1. isa指针
  2. superclass指针
  3. 类的属性信息(@property),类的成员变量信息(ivar)
  4. 类的对象方法信息(instance method),类的协议信息(protocol)
  5. ……

meta-class

元类对象获取方式:

//runtime中传入 类对象 此时得到的就是元类对象
Class objectMetaClass = object_getClass([NSObject class]);
class_isMetaClass(objectMetaClass) // 判断该对象是否为元类对象

特性:每个类在内存中有且只有一个meta-class对象
作用:存放了类方法。而class存放 类的对象方法

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

  1. isa指针
  2. superclass指针
  3. 类的类方法的信息(class method)
  4. ……

除了类方法,meta-class对象和class对象的内存结构是一样的

isa 指针

在调用方法时,isa的作用:

  1. instance的isa指向class,当调用对象方法时,通过instance的isa找到class,最后找到对象方法的实现进行调用。
  2. class的isa指向meta-class
    当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用
上一篇下一篇

猜你喜欢

热点阅读