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

2016-12-07  本文已影响663人  fuadam1982

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

这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的原生类型(或者说值类型),肯定是在栈上分配。当函数执行结束时会被直接销毁。而其它的引用类型(或者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)。

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

上一篇 下一篇

猜你喜欢

热点阅读