block使用copy原理

2021-07-24 05:43:46 字數 1047 閱讀 7549

簡單來說,block就像乙個函式指標,指向我們要使用的函式。

就和函式呼叫一樣的,不管你在**寫了這個block,只要你把它放在了記憶體中(通過呼叫存在這個block的方法或者是函式),不管放在棧中還是在堆中,還是在靜態區。只要他沒有被銷毀,你都可以通過你宣告的block呼叫他。

說到在類中宣告乙個block為什麼要用copy修飾的話,那就要先說block的三種型別。

1._nsconcreteglobalblock,全域性的靜態block,不會訪問外部的變數。就是說如果你的block沒有呼叫其他的外部變數,那你的block型別就是這種。例如:你僅僅在你的block裡面寫乙個nslog("hello world");

2._nsconcretestackblock 儲存在棧中的 block,當函式返回時會被銷毀。這個block就是你宣告的時候不用copy修飾,並且你的block訪問了外部變數。

3._nsconcretemallocblock 儲存在堆中的 block,當引用計數為 0 時會被銷毀。好了,這個就是今天的主角,用copy修飾的block。

我們知道,函式的宣告週期是隨著函式呼叫的結束就終止了。我們的block是寫在函式中的。

如果是全域性靜態block的話,他直到程式結束的時候,才會被被釋放。但是我們實際操作中基本上不會使用到不訪問外部變數的block。【但是在測試三種區別的時候,因為沒有很好的理解這種block,(用沒有copy修飾和沒有訪問外部變數的block)試了好多次,以為是放在靜態區裡面的block沒有隨函式結束被釋放。這是個小坑】

如果是儲存在棧中的block,他會隨著函式呼叫結束被銷毀。從而導致我們在執行乙個包含block的函式之後,就無法再訪問這個block。因為(函式結束,函式棧就銷毀了,存在函式裡面的block也就沒有了),我們再使用block時,就會產生空指標異常。

如果是堆中的block,也就是copy修飾的block。他的生命 週期就是隨著物件的銷毀而結束的。只要物件不銷毀,我們就可以呼叫的到在堆中的block。

這就是為什麼我們要用copy來修飾block。因為不用copy修飾的訪問外部變數的block,只在他所在的函式被呼叫的那一瞬間可以使用。之後就消失了。

Block用copy來修飾

block使用copy是從mrc遺留下來的 傳統 在mrc中,方法內部的block是在棧區的,使用copy可以把它放到堆區.在arc中寫不寫都行 對於block使用copy還是strong效果是一樣的,但寫上copy也無傷大雅,還能時刻提醒我們 編譯器自動對block進行了copy操作。block在...

OC 為何用copy修飾block

簡單來說,block就像乙個函式指標,指向我們要使用的函式。就和函式呼叫一樣的,不管你在 寫了這個block,只要你把它放在了記憶體中 通過呼叫存在這個block的方 法或者是函式 不管放在棧中還是在堆中,還是在靜態區。只要他沒有被銷毀,你都可以通過你宣告的block調 用他。說到在類中宣告乙個bl...

Block中 block實現原理

三.block中 block實現原理 我們繼續研究一下 block實現原理。1.普通非物件的變數 先來看看普通變數的情況。import int main int argc,const char ar myblock return 0 把上述 用clang轉換成原始碼。struct block byr...