1. 一个NSObject对象占用多少内存?
- 系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
- NSObject对象内部只使用了8个字节的空间(可以通过class_getInstanceSize函数获得)
NSObject *obj = [[NSObject alloc]init];
//获得NSObject类的实例对象的成员变量所占用的大小 : 8 ,存放的isa指针
NSLog(@"%zd",class_getInstanceSize([NSObject class])); // 8
NSLog(@"%zd",class_getInstanceSize([obj class]));//8
/*
size_t class_getInstanceSize(Class cls)
{
if (!cls) return 0;
return cls->alignedInstanceSize();
}
// Class's ivar size rounded up to a pointer-size boundary.类的成员变量所占用的大小
uint32_t alignedInstanceSize() const {
return word_align(unalignedInstanceSize());
}
*/
// 获得obj指针所指向内存的大小
NSLog(@"%zd",malloc_size((__bridge const void*) obj)); //16 分配了16个字节的大小
//#import <malloc/malloc.h>
//分配大小的时候,如果大小不足16个字节,就强制分配16个字节.
//分配了16个字节的大小,被利用起来的只有8个字节的大小
1.student的内存大小
内存大小是父类结构体的实现,加上自身的成员变量的大小
@interface Student : NSObject
{
@public
int _no;
int _age;
}
@end
// 转成结构体就是
struct Student_impl {
Class isa;//isa继承至NSObject
int _no;
int _age;
};
// 一个类的大小 包括父类结构体的实现,和成员变量
NSLog(@"%zd",class_getInstanceSize([Student class]));//16
NSLog(@"%zd",malloc_size( (__bridge const void *)student));//16
//可以把student转换成结构体指针
struct Student_impl *stuimpl = (__bridge struct Student_impl *)student;
NSLog(@"_no is %d,_age is %d",stuimpl->_no,stuimpl->_age); //4 5
如果给student添加一个成员变量
@interface Student : NSObject
{
@public
int _no;
int _age;
int _ui; //新加
}
NSLog(@"%zd",class_getInstanceSize([Student class]));
// 24 内存对齐过的 ,最大成员大小(isa=8字节)的倍数
NSLog(@"%zd",malloc_size( (__bridge const void *)student));
// 32 16的倍数
结构体的大小必须是最大成员大小的倍数
isa的大小是8,所以大小是8的倍数
2. 一个Person对象、一个Student对象占用多少内存空间?
16 16
2.两个容易混淆的函数
//创建一个实例对象,至少需要多少内存
#import <objc/runtime.h>
class_getInstanceSize([NSObject class]);
//创建一个实例对象,实际上分配了多少内存
#import <malloc/malloc.h>
malloc_size((__bridge const void*)obj);