OC底层->Objective-C的本质

707 阅读1分钟

类的数据结构

image.png

  • 无成员变量的内存结构 image.png

  • 内存分析示意图 image.png

  • 有成员变量的内存结构 image.png image.png image.png

  • 内存视图 image.png

  • 实时查看内存数据 image.png

  • LLDB-指令 image.png

  • LLDB 练习 image.png

创建一个实例对象,至少需要多少内存?
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);

创建一个实例对象,实际上分配了多少内存?
#import <malloc/malloc.h>
malloc_size((__bridge const void *)obj);

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <malloc/malloc.h>

// NSObject Implementation
struct NSObject_IMPL {
    Class isa; // 8个字节
};
// 指针
// typedef struct objc_class *Class;

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSObject *obj = [[NSObject alloc] init];
        // 16个字节
        
        // 获得NSObject实例对象的成员变量所占用的大小 >> 8
        NSLog(@"%zd", class_getInstanceSize([NSObject class]));
        
        // 获得obj指针所指向内存的大小 >> 16
        NSLog(@"%zd", malloc_size((__bridge const void *)obj));
        
        // 什么平台的代码
        // 不同平台支持的代码肯定是不一样
        // Windows、mac、iOS
        // 模拟器(i386)、32bit(armv7)、64bit(arm64)
    }
    return 0;
}

OC源码下载地址

  • 小于16的情况下补齐到16 image.png

oc对象的分类

  • Objective-C 中的对象简称OC对象,主要分为三种
    • instance对象 实例对象
    • class对象 类对象
    • meta-class 元类对象

instance

image.png

class

image.png

meta-class

image.png

注意

image.png

查看Class是否为meta-class

image.png