iOS (OC 和 Swift) 获取对象实际占用的内存大小

Swift

使用Swift新方案:MemoryLayout

示例:

struct Point {
    let x: Double
    let y: Double
    let isFilled: Bool
}
MemoryLayout.size == 17// 实际用到的空间大小
MemoryLayout.stride == 24//系统分配的空间大小
MemoryLayout.alignment == 8//对齐参数

在实际测试中,用MemoryLayout的方式计算对象时,只是返回对象的引用大小,或者说返回了指针占用的内存空间,导致返回的值总是8

对于对象实际占用的内存空间,可以通过runtime的方法来获取。

class CustomClass {
    let a: Int = 8
    let b: String = "3"
    let c: Bool = false
}

let a1 = MemoryLayout.size // 8
let a2 = MemoryLayout.stride // 8
let a3 = MemoryLayout.alignment // 8
let a4 = class_getInstanceSize(CustomClass.self) // 48 (一个没有属性的类占用16,这个类的属性至少需要17个字节,所以需要的空间是33,开辟内存空间的一页是16,这里的48就相当于开辟了三页)

OC

OC 中我们常用的有三种方案:

  • sizeof

  • class_getInstanceSize

  • malloc_size

sizeof

sizeof方式 并不是一个方法调用,是一个编译器特性,在编译时期,就将类型的值计算出来,它表示的是一种数据类型的大小。比如在计算对象时,计算的就是该对象的指针所占用的内存空间大小

class_getInstanceSize

foom_runtime统计内存占用.png

class_getInstanceSize 获取的是 对象实际占用的内存空间大小

malloc_size

OC 对象开辟的内存空间,malloc_size 是系统给对象分配的空间,calloc 在开辟空间时,采用的是 16字节对齐方式。

你可能感兴趣的:(iOS (OC 和 Swift) 获取对象实际占用的内存大小)