美文网首页
回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

作者: fuadam1982 | 来源:发表于2016-12-07 17:33 被阅读663次

    ** 如何查看一个对象是在堆区还是在栈区 **

    这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的原生类型(或者说值类型),肯定是在栈上分配。当函数执行结束时会被直接销毁。而其它的引用类型(或者oc中的interface)都是在堆上创建的,由ARC负责清理。例如:

    func boo() -> Any {
        // a、b都是值类型,在栈上分配,boo执行结束后销毁
        let a = 3
        let b = 5
        // my1是值类型,在栈上分配,boo执行结束后销毁
        let my1 = MyStruct(val: a+b)
        // my2是引用类型,在堆上分配,my1被拷贝一份内存副本传递到MyClass.init中
        let my2 = MyClass(val: my1)
        // my2因为离开了函数调用栈,所以被ARC标记为autorelease,如果用oc的MRC写法是[my2 autorelease]。它的内存释放依赖于外层(或者系统)的autoreleasepool调用
        return my2
    }
    

    我猜他实际想问的是这个

    class Foo {
        let a = 1
    }
    

    这个时候,a字段是在栈上还是堆上?如果是这个问题,那么答案是a分配在堆上(属于Foo实例内存的一部分),虽然它是个值类型(Int)。

    ** 因为值类型与在栈上还是堆上分配内存关系不大,而和传值拷贝(隐含为不可变性)关系交大 **

    相关文章

      网友评论

          本文标题:回答一个问题:xcode 中如何查看一个对象是在堆区还是在栈区?

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