iOS 查看 size

169 阅读1分钟

查看大小一般有这几种方法:

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字节, namenickName都是指针变量, 各占8 字节. age 点4字节, height 占8字节. 加起来一共是36字节, 因为对象的本质是结构体, 所以他的大小是最大成员整数倍, 8 的倍数, 刚好比36大的就是40. 所以他的实际大小是 40字节.
  • 系统实际为 person 对象的开辟的空间大小是 16字节 对齐, 比 40 大的最小的 16的倍数就是 48. 所以系统为person 对象的开辟的空间大小 48字节