** 如何查看一个对象是在堆区还是在栈区 **
这个问题问的就比较模糊,如果是在函数执行过程当中,那么定义在本地的原生类型(或者说值类型),肯定是在栈上分配。当函数执行结束时会被直接销毁。而其它的引用类型(或者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)。
** 因为值类型与在栈上还是堆上分配内存关系不大,而和传值拷贝(隐含为不可变性)关系交大 **
网友评论