iOS 關(guān)于堆棧
1. 堆棧定義
低位地址的 內(nèi)存塊。 (執(zhí)行速度最快, 先進后出试躏, 大小比堆小,不需要手動釋放內(nèi)存 )
公共的內(nèi)存塊设褐, (程序員手動管理內(nèi)存)
說明:對于一個方法颠蕴,當(dāng)進入該方法作用域后,線程棧區(qū)形成一個棧幀(stack frame)(包括參數(shù)助析,局部變量犀被,返回值等)進入棧中。當(dāng)執(zhí)行完畢后外冀,該棧幀彈出寡键,棧幀內(nèi)所有內(nèi)存全部銷毀。棧中內(nèi)存有系統(tǒng)西東管理锥惋,不會出現(xiàn)內(nèi)存泄露問題昌腰。
2. 堆棧變量
根據(jù)存放位置分開堆棧變量
3. 關(guān)于block的堆棧特性
定義block時候开伏,其被放置于棧區(qū)中。意味著該變量僅在定義的作用域中有效遭商。當(dāng)超出作用域后固灵,棧區(qū)將在某個時機將該內(nèi)存回收。
若想讓該變量長時間存在劫流,需要將其拷貝到堆區(qū)巫玻。
例子
void (^blockName) (void);
if ( /* someCondition */) {
blockName = ^ {
// …..
}
} else {
blockName = ^ {
// ……
}
}
blockName();
// 會出現(xiàn)時而崩潰,時而不崩潰的問題
// 原因:在if 條件塊中祠汇,定義了兩個blockName的對象實例仍秤。定義的兩個對象均存儲于棧內(nèi)存中。作用域均在塊級作用域中(即if塊中)可很。當(dāng)作用域離開if塊诗力,到達外層后,則有一定概率內(nèi)存可能被回收我抠。此時調(diào)用blockName可能會導(dǎo)致崩潰
4. block屬性關(guān)鍵字使用copy的原因
同上苇本,當(dāng)block被定義后其存在于棧區(qū)。當(dāng)出現(xiàn)作用域改變的情況菜拓,原block就有可能被回收瓣窄。當(dāng)做賦值操作時,其需要進行copy操作纳鼎,將block從棧區(qū)拷貝到堆區(qū)俺夕。保證在使用的過程中block不會被回收
參考鏈接