天天看點

iOS block為什麼要用copy

//聯系人:石虎  QQ: 1224614774昵稱:嗡嘛呢叭咪哄

一、棧區和堆區概念

記憶體的棧區 :  由編譯器自動配置設定釋放, 存放函數的參數值, 局部變量的值等. 其操作方式類似于資料結構中的棧.

記憶體的堆區 :  一般由程式員配置設定釋放, 若程式員不釋放, 程式結束時可能由OS回收. 注意它與資料結構中的堆是兩回事, 配置設定方式倒是類似于連結清單.

二、block用copy作用域

首先, block是一個對象, 是以block理論上是可以retain/release的. 但是block在建立的時候它的記憶體是預設是配置設定在棧(stack)上, 而不是堆(heap)上的. 是以它的作用域僅限建立時候的目前上下文(函數, 方法...), 當你在該作用域外調用該block時, 程式就會崩潰.

官方文檔:

iOS block為什麼要用copy

注意:            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下走過來的

謝謝!!!