OC 实例对象本质

180 阅读1分钟

记录学习Objective-C底层学习的一些知识点

  • 初始化一个NSObject对象
NSObject *object = [[NSObject alloc] init];
  • 获取类所占内存大小 (#import <objc/runtime.h>)
class_getInstanceSize([NSObject class])
  • 获取对象指针所指向内存的大小(#import <malloc/malloc.h>)
malloc_size((__bridge const void *)object)

一个基本的NSObject类指针指向内存一般为16字节(小于16字节,系统会分配16字节)

  • NSObject的本质是一个结构体如下,虽然isa需要8字节,但是系统分配16字节
struct NSObject_IMPL {
    Class isa; // 所占字节为8
};
  • Student 类如下
@interface Student : NSObject

@property(nonatomic,assign)NSInteger age;

@end
  • 继承于NSObject的Student类结构如下
struct Student_IMPL {

    struct NSObject_IMPL NSObject_IVARS; // 内存是 8 字节
    int age; // 8字节
};

结构体内单个成员变量所需的内存与系统分配不同,系统是以16字节为单位,所以当Student有一个int成员变量系统分配16字节,两个也是16字节,三个实际占用24字节,但是系统分配32字节

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main-arm64.cpp 通过这个命令可以得到编译后的c/c++源码,看到相关类的结构体本质

  • 初始化一个对象,在内存中存储结构体的成员变量,如下
  1. isa指针,指向该对象内存地址的指针
  2. 其他成员变量 ⚠️ 没有函数,内存不存储函数