首先搞懂棧區(qū)和堆區(qū)概念
內存的棧區(qū) : ?由編譯器自動分配釋放, 存放函數的參數值, 局部變量的值等. 其操作方式類似于數據結構中的棧.
內存的堆區(qū) : ?一般由程序員分配釋放, 若程序員不釋放, 程序結束時可能由OS回收. 注意它與數據結構中的堆是兩回事, 分配方式倒是類似于鏈表.
block用copy作用域:
首先, block是一個對象, 所以block理論上是可以retain/release的. 但是block在創(chuàng)建的時候它的內存是默認是分配在棧(stack)上, 而不是堆(heap)上的. 所以它的作用域僅限創(chuàng)建時候的當前上下文(函數, 方法...), 當你在該作用域外調用該block時, 程序就會崩潰.
?1.一般情況下你不需要自行調用copy或者retain一個block. 只有當你需要在block定義域以外的地方使用時才需要copy. Copy將block從內存棧區(qū)移到堆區(qū).
2.其實block使用copy是MRC留下來的也算是一個傳統(tǒng)吧, 在MRC下, 如上述, 在方法中的block創(chuàng)建在棧區(qū), 使用copy就能把他放到堆區(qū), 這樣在作用域外調用該block程序就不會崩潰.
3.但在ARC下, 使用copy與strong其實都一樣, 因為block的retain就是用copy來實現(xiàn)的, 所以block使用copy還能裝裝逼, 說明自己是從MRC下走過來的