Block

block實際是將函數(shù)及其上下文封裝起來的對象,block的調(diào)用實際上是函數(shù)的調(diào)用
截獲變量:對基本數(shù)據(jù)類型的局部變量截獲其值,對于對象類型的局部變量連同所有權(quán)修飾符一起截獲,1??指針形式截獲局部靜態(tài)變量,不截獲全局變量,靜態(tài)全局變量
一般對截獲局部變量進行賦值操作時需要用到__block,靜態(tài)局部變量、全局變量、靜態(tài)全局變量不需要
__block修飾的基本數(shù)據(jù)類型會變成一個對象,如果改動了其值,調(diào)用block是里面的值也是變化的
_NSConcreteGlobalBlock 全局類型的block,copy操作說明都不會做
_NSConcreteStackBlock 棧上的block,copy操作會到堆上去,在作用域結(jié)束后__block修飾的變量和block都會被銷毀,棧上的block的_forwarding指針指向自己,如果進行copy之后會指向堆上的block對象,堆上的_forwarding會指向自己,如果再修改棧block的成員變量其實是修改堆上的block,如果進行copy到堆上在mrc上沒有被銷毀會產(chǎn)生循環(huán)引用
_NSConcreteMallocBlock 堆上的block,copy操作增加引用計數(shù),
無論在任何位置都可以順利訪問同一個__block變量,如果沒有進行copy則訪問棧上的block成員變量,如果進行了copy則訪問堆上的block成員變量
大環(huán)引用,self引用了block,__block修飾self引用的成員變量,self->block,self->var,__block->var,block->__block,解決方法斷開環(huán)block里斷開(__block修飾的成員變量置為nil),存在一個問題,如果不用block可能就斷不開這個環(huán)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容