OC 為何用copy修飾block

2021-08-29 05:19:50 字數 1043 閱讀 5428

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

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

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

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

2._nsconcretestackblock 儲存在棧中的 block,當函式返回時會被銷毀。這個block就是你宣告的時候不用c opy修飾,並且你的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,只在他所在的函式被呼叫的那一瞬間可以使用。之後就消失了。

oc82 成員變數使用copy修飾

import typedef void myblock inte ce person nsobject property nonatomic,retain nsstring name property nonatomic,copy nsstring name 注意 如果是block使用copy並不是...

oc82 成員變數使用copy修飾

import typedef void myblock inte ce person nsobject property nonatomic,retain nsstring name property nonatomic,copy nsstring name 注意 如果是block使用copy並不是...

Block用copy來修飾

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