** 如何查看一個對象是在堆區(qū)還是在棧區(qū) **
這個問題問的就比較模糊翘贮,如果是在函數(shù)執(zhí)行過程當(dāng)中,那么定義在本地的原生類型(或者說值類型)爆惧,肯定是在棧上分配狸页。當(dāng)函數(shù)執(zhí)行結(jié)束時會被直接銷毀。而其它的引用類型(或者oc中的interface)都是在堆上創(chuàng)建的扯再,由ARC負(fù)責(zé)清理芍耘。例如:
func boo() -> Any {
// a、b都是值類型熄阻,在棧上分配斋竞,boo執(zhí)行結(jié)束后銷毀
let a = 3
let b = 5
// my1是值類型,在棧上分配秃殉,boo執(zhí)行結(jié)束后銷毀
let my1 = MyStruct(val: a+b)
// my2是引用類型坝初,在堆上分配浸剩,my1被拷貝一份內(nèi)存副本傳遞到MyClass.init中
let my2 = MyClass(val: my1)
// my2因為離開了函數(shù)調(diào)用棧,所以被ARC標(biāo)記為autorelease鳄袍,如果用oc的MRC寫法是[my2 autorelease]绢要。它的內(nèi)存釋放依賴于外層(或者系統(tǒng))的autoreleasepool調(diào)用
return my2
}
我猜他實(shí)際想問的是這個
class Foo {
let a = 1
}
這個時候,a字段是在棧上還是堆上拗小?如果是這個問題重罪,那么答案是a分配在堆上(屬于Foo實(shí)例內(nèi)存的一部分),雖然它是個值類型(Int)哀九。
** 因為值類型與在棧上還是堆上分配內(nèi)存關(guān)系不大剿配,而和傳值拷貝(隱含為不可變性)關(guān)系交大 **