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]);