记录学习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++源码,看到相关类的结构体本质
- 初始化一个对象,在内存中存储结构体的成员变量,如下
- isa指针,指向该对象内存地址的指针
- 其他成员变量 ⚠️ 没有函数,内存不存储函数