block使用copy是從mrc遺留下來的「傳統」,在mrc中,方法內部的block是在棧區的,使用copy可以把它放到堆區.在arc中寫不寫都行:對於block使用copy還是strong效果是一樣的,但寫上copy也無傷大雅,還能時刻提醒我們:編譯器自動對block進行了copy操作。
block在建立的時候,它的記憶體是分配在棧上的,而不是在堆上。他本身的作於域是屬於建立時候的作用域,一旦在建立時候的作用域外面呼叫block將導致程式崩潰。因為棧區的特點就是建立的物件隨時可能被銷毀,一旦被銷毀後續再次呼叫空物件就可能會造成程式崩潰,在對block進行copy後,block存放在堆區.
使用retain也可以,但是block的retain行為預設是用copy的行為實現的,
因為block變數預設是宣告為棧變數的,為了能夠在block的宣告域外使用,所以要把block拷貝(copy)到堆,所以說為了block屬性宣告和實際的操作一致,最好宣告為copy。
copy此特質所表達的所屬關係與strong類似。然而設定方法並不保留新值,而是將其「拷貝」 (copy)。 當屬性型別為nsstring時,經常用此特質來保護其封裝性,因為傳遞給設定方法的新值有可能指向乙個nsmutablestring類的例項。這個類是nsstring的子類,表示一種可修改其值的字串,此時若是不拷貝字串,那麼設定完屬性之後,字串的值就可能會在物件不知情的情況下遭人更改。所以,這時就要拷貝乙份「不可變」 (immutable)的字串,確保物件中的字串值不會無意間變動。只要實現屬性所用的物件是「可變的」 (mutable),就應該在設定新屬性值時拷貝乙份。
另一方面,block也會經常導致迴圈引用,所以通常的做法就是,在外部建立乙個weakself(用__weak修飾的self),來防止迴圈引用。這裡最好在block內部再宣告乙個strongself(用__strong來修飾weakself).這是因為保證**在執行block期間,self不會被釋放,當block執行完後,會自動釋放該strongself;
Block為什麼用copy修飾
預設情況下,block是存檔在棧中,可能被隨時 通過copy操作可以使其在堆中保留乙份,相當於一直強引用著,因此如果block中用到self時,需要將其弱化,通過 weak或者 unsafe unretained.以下是示例 及其說明,讀者可以試著列印出不同情況下block的記憶體情況 viewco...
block要用copy修飾,還是用strong
棧區與堆區 block本身是像物件一樣可以retain,和release。但是,block在建立的時候,它的記憶體是分配在棧 stack 上,而不是在堆 heap 上。他本身的作於域是屬於建立時候的作用域,一旦在建立時候的作用域外面呼叫block將導致程式崩潰。使用retain也可以,但是block...
iOS之Block為什麼用copy修飾
在通讀文章之前,您可能需要了解記憶體分配的基礎知識。預設情況下,block是存檔在棧中,可能被隨時 通過copy操作可以使其在堆中保留乙份,相當於一直強引用著,因此如果block中用到self時,需要將其弱化,通過 weak或者 unsafe unretained.以下是示例 及其說明,讀者可以試著...