查看大小一般有这几种方法:
1. sizeof()
只是一个操作符, 并不是一个函数, 检测的是类型的大小, 参数可以是变量, 也可以是基本的数据的类型, 如 int, double ... , Person 不可以, [Person class] , p 可以;
Person *p = [Person alloc];
sizeof(person)
sizeof(Person)
2. class_getInstanceSize
对象真正占有的内存, 有效的内存. 参数是对象的 Class 类型.
class_getInstanceSize([Person class]);
3. malloc_size
系统为对象实际开辟的内存大小, 是按 16字节 对齐分配的, 大于等于对象真正占有的内存, 就是说会有部分是没有用到的. 参数是一个指针.
malloc_size((__bridge const void *)(person))
示例
Person 类有4个属性.
@interface Person : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *nickName;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) long height;
@end
测试代码
int main(int argc, const char * argv[]) {
Person *person = [Person alloc];
person.name = @"Cooci";
person.nickName = @"KC";
NSLog(@"%@ - %lu - %lu - %lu",person,sizeof(person),class_getInstanceSize([Person class]),malloc_size((__bridge const void *)(person)));
return 0;
}
输出结果:
<Person: 0x10051f100> - 8 - 40 - 48
- person 是一个指针. 所以他的大小就是类型的大小, 占 8字节.
- Person类型的对象占用内存的实际大小是 isa 占8字节,
name和nickName都是指针变量, 各占8 字节.age点4字节,height占8字节. 加起来一共是36字节, 因为对象的本质是结构体, 所以他的大小是最大成员整数倍, 8 的倍数, 刚好比36大的就是40. 所以他的实际大小是40字节. - 系统实际为 person 对象的开辟的空间大小是
16字节对齐, 比 40 大的最小的 16的倍数就是 48. 所以系统为person 对象的开辟的空间大小48字节