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