源码即原理
三个问题:
1、对象的本质是什么?
2、对象分为哪几种?各有什么作用?
3、isa指针的作用?
一、对象的本质
在OC中,任何类的定义都是对象。我们可以通过编译后的文件查看对象的源代码。
NSObject *objc = [[NSObject alloc] init];
//不难发现,OC中的对象其实就是通过C的结构体来实现的,并且NSObject对象中包含了一个指针。
struct NSObject_IMPL {
Class isa; // typedef struct objc_class *Class;
};
在64位的系统架构中,一个指针占用了8个字节,但是我们通过malloc_size函数去获取系统为它申请的内存空间时却是16字节。这是因为iOS系统的内存对齐机制,对象的内存大小只能是8的倍数并且最少是16个字节。从以下源码可以看到:
// 在_class_createInstanceFromZone函数中可以找到instance size的获取方法
size_t instanceSize(size_t extraBytes) {
size_t size = alignedInstanceSize() + extraBytes;
// CF requires all objects be at least 16 bytes.
if (size < 16) size = 16;
return size;
}
二、对象分为哪几种?各有什么作用?
- 实例对象: 包含实例的成员变量信息
- 类对象: 包含实例方法、属性、协议等信息(内存中只有一份)
- 元类对象: 包含类方法等信息(内存中只有一份)
三、isa指针的作用?
这张图说明了一切