//聯(lián)系人:石虎QQ: 1224614774昵稱(chēng):嗡嘛呢叭咪哄
一、棧區(qū)和堆區(qū)概念
內(nèi)存的棧區(qū) :由編譯器自動(dòng)分配釋放, 存放函數(shù)的參數(shù)值, 局部變量的值等. 其操作方式類(lèi)似于數(shù)據(jù)結(jié)構(gòu)中的棧.
內(nèi)存的堆區(qū) :一般由程序員分配釋放, 若程序員不釋放, 程序結(jié)束時(shí)可能由OS回收. 注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事, 分配方式倒是類(lèi)似于鏈表.
二驻仅、block用copy作用域
首先, block是一個(gè)對(duì)象, 所以block理論上是可以retain/release的. 但是block在創(chuàng)建的時(shí)候它的內(nèi)存是默認(rèn)是分配在棧(stack)上, 而不是堆(heap)上的. 所以它的作用域僅限創(chuàng)建時(shí)候的當(dāng)前上下文(函數(shù), 方法...), 當(dāng)你在該作用域外調(diào)用該block時(shí), 程序就會(huì)崩潰.
官方文檔:
注意:
1.一般情況下你不需要自行調(diào)用copy或者retain一個(gè)block. 只有當(dāng)你需要在block定義域以外的地方使用時(shí)才需要copy. Copy將block從內(nèi)存棧區(qū)移到堆區(qū).
2.其實(shí)block使用copy是MRC留下來(lái)的也算是一個(gè)傳統(tǒng)吧, 在MRC下, 如上述, 在方法中的block創(chuàng)建在棧區(qū), 使用copy就能把他放到堆區(qū), 這樣在作用域外調(diào)用該block程序就不會(huì)崩潰.
3.但在A(yíng)RC下, 使用copy與strong其實(shí)都一樣, 因?yàn)閎lock的retain就是用copy來(lái)實(shí)現(xiàn)的, 所以block使用copy還能裝裝逼, 說(shuō)明自己是從MRC下走過(guò)來(lái)的