美文网首页
iOS (OC 和 Swift) 获取对象实际占用的内存大小

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

作者: topws1 | 来源:发表于2022-01-21 14:53 被阅读0次

    Swift

    使用Swift新方案:MemoryLayout

    示例:

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

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

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

    class CustomClass {
        let a: Int = 8
        let b: String = "3"
        let c: Bool = false
    }
    
    let a1 = MemoryLayout<CustomClass>.size // 8
    let a2 = MemoryLayout<CustomClass>.stride // 8
    let a3 = MemoryLayout<CustomClass>.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) 获取对象实际占用的内存大小

          本文链接:https://www.haomeiwen.com/subject/jlrehrtx.html