iOS-底层知识-object的本质

源码即原理

三个问题:

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;
}

二、对象分为哪几种?各有什么作用?

  1. 实例对象: 包含实例的成员变量信息
  2. 类对象: 包含实例方法、属性、协议等信息(内存中只有一份)
  3. 元类对象: 包含类方法等信息(内存中只有一份)

三、isa指针的作用?
这张图说明了一切


截屏2021-11-20 上午12.02.39.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容