美文网首页
底层原理(一)-OC语法

底层原理(一)-OC语法

作者: SwordDevil | 来源:发表于2021-05-23 22:31 被阅读0次

一、OC 底层原理

1、object-c-->c/c++-->汇编语言-->机器语言
2、一个NSObject对象占用多少内存?
系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
但NSObject对象内部只使用了8个字节的空间(在64bit环境下,可以通过class_getInstanceSize函数获得)

#import <objc/runtime.h> 
#import <malloc/malloc.h>
// 获得NSObject实例对象的成员变量所占用的大小 >> 8
NSLog(@"%zd", class_getInstanceSize([NSObject class]));
        
// 获得obj指针所指向内存的大小 >> 16
NSLog(@"%zd", malloc_size((__bridge const void *)obj));

3、常用的LLDB命令


image.png

4、内存对齐:结构体的大小必须是最大成员大小的倍数
5、oc分配内存 桶的概念 16 32 48 64 80 96 112 都是16的倍数

二、OC对象的分类

instance对象(实例对象)
class对象(类对象)
meta-class对象(元类对象)

instance对象

1、instance对象都是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
2、instance对象在内存中存储的信息包括

  • isa指针
  • 其他成员变量
class对象

1、可以通过以下方法获取class对象


image.png

他们是同一个对象。每个类在内存中有且只有一个class对象
2、class对象在内存中存储的信息包括

  • isa指针
  • superclass指针
  • 类的属性信息(@property)、类的对象方法信息(instance method)
  • 类的协议信息(protocol)、类的成员变量信息(ivar)
meta-class对象

1、可以通过下边方法获取meta-class对象


image.png
image.png
image.png

每个类在内存中有且只有一个meta-class对象
meta-class对象和class对象内存结构是一样的,但是用途不一样
2、meta-class对象字内存中存储的信息包括

  • isa指针
  • superclass指针
  • 类的类方法信息方法


    runtime 获取object_getClass方法
instance对象、class对象、meta-class对象之间的联系

1、调用类的方法:本质就是runtime中的msg_send方法


image.png

2、isa指针指向


image.png
3、class对象的superclass指针
image.png

4、meta-class对象的superclass指针


image.png
5、总结
image.png
6、从64bit开始,isa需要进行一次位运算,才能计算出实际地址
image.png
7、窥探struct objc_class的结构
image.png

相关文章

网友评论

      本文标题:底层原理(一)-OC语法

      本文链接:https://www.haomeiwen.com/subject/urvmwktx.html