OC对象的本质

716 阅读3分钟

1.Objective-C语言的底层是怎么实现的?

Objecttive-c底层实现是用c/c++语言实现的。

2.Objective-C类是用的c/c++的哪一种数据结构呢?

结构体。

3.NSObject类的底层实现是怎样的?

struct NSObject_IMPL { Class isa; }; NSObject类实际上是一个结构体,结构体里面只有一个成员变量,一个Class数据结构的isa变量。

4.这个Class是什么数据结构呢?

typedef struct objc_class *Class; 可以看出Class是一个objc_class结构体指针。

5.那么这个objc_class是什么数据结构呢?

struct objc_class { Class isa;} 里面同样有一个isa指针。

6.一个NSObject对象占用多少内存?

一个NSObject对象实际上是一个结构体,结构体中只有一个isa指针,一个指针的大小在64bit下是8字节,在32bit下是4字节。

7.如何获取一个实例对象所占内存空间的大小?

使用runtime中的一个函数 class_getInstenceSize([NSObject class]);

8. 5.Objective-C中的对象分为几种?且里面存储的信息都有哪些?

分为三种:

  • instance对象:或叫实例对象,通过类alloc出来的对象,存储信息:isa指针和其他的成员变量。
  • class对象:或叫类对象,存储信息: isa指针 superclass指针 类的属性信息(@property) 类的对象方法信息(instence method) 类的协议信息(protocol) 类的成员变量信息(ivar)
  • meta-class对象:或叫元类对象 存储信息:isa指针 superclass指针 类的类方法信息

9.如何获取类对象(Class)?

NSObject *object1 = [NSObject alloc] init]; Class objectClass1 = [object1 class]; Class objectClass2 = [NSObject class];

Class objectClass3 = object_getClass(object1); // runtime API.

10.如何获取元类对象(meta-class)?

Class objectMetaClass = object_getclass([NSObject class]);

11.isa指针是什么?指向哪里?

根据苹果的介绍: A pointer to the class definition of which this object is an instance. 每一个实例对象中都会有一个isa指针,这个指针指向类对象。 那么类对象中的isa指针指向哪里呢? class的isa指向meta-class

12. 实例对象是如何调用实例方法的,以及类对象是如何调用类方法的?

  • 因为实例对象中的isa指针指向类对象,所以就可以找到类对象。找到类对象后,就可以调用存储在类对象中的实例方法。
  • 类对象中的isa指针指向元类对象,所以就可以找到元类对象。找到元类对象后,就可以调用存储在元类对象中的实例方法了。

13.子类对象是如何调用父类实例方法的呢? 子类是如何调用父类的类方法的呢?

  • 子类实例对象首先通过isa指针找到类对象、然后通过类对象中的superclass指针找到父类类对象,在调用父类中的实例方法。
  • 子类类对象首先通过isa指针找到元类对象,然后通过元类对象中的superclass指针找到对应父类的元类,在调用存放在元类对象中的类方法

14.如何查看Class是否为meta-class?

BOOL result = class_isMetaClass([NSObject class]);