Block

Block:帶有自動變量的匿名函數(shù)。匿名函數(shù):沒有函數(shù)名的函數(shù),一對{}包裹的內(nèi)容是匿名函數(shù)的作用域。自動變量:棧上聲明的一個變量不是靜態(tài)變量和全局變量,是不可以在這個棧內(nèi)聲明的匿名函數(shù)中使用的,但在Block中卻可以。雖然使用Block不用聲明類,但是Block提供了類似Objective-C的類一樣可以通過成員變量來保存作用域外變量值的方法,那些在Block的一對{}里使用到但卻是在{}作用域以外聲明的變量,就是Block截獲的自動變量。

一、Block的語法及基本使用

二、 Block訪問外部變量

1、 Block內(nèi)部訪問外部局部變量,Block內(nèi)部會創(chuàng)建一個新的const變量,并把外部變量的值傳給新變量。新的變量值不能被修改,同時外部變量值變化也不會影響到新的變量。

2、 Block內(nèi)部訪問外部靜態(tài)變量,Block內(nèi)會創(chuàng)建一個指向靜態(tài)變量的指針,Block內(nèi)外訪問的是同一塊內(nèi)存,因此在Block內(nèi)部可以對外部靜態(tài)變量進(jìn)行修改,同時外部變量修改也會影響到Block內(nèi)部的值。

3、 Block內(nèi)部訪問外部局部變量時,在變量前面加上__Block修飾一下,Block內(nèi)部就會想訪問靜態(tài)變量一樣,創(chuàng)建一個指針指向外部局部變量,結(jié)果參照靜態(tài)變量。從內(nèi)存的角度來看,局部變量在棧上,使用__block修飾局部變量后,block會把局部變量復(fù)制一份到堆中,并讓棧上的變量也指向堆中的新變量,此時在block內(nèi)部和外部就訪問了同一塊內(nèi)存,避免了局部變量在block執(zhí)行之前就被釋放,延長了局部變量的生命周期。

[if !supportLists]4、????????[endif]Block內(nèi)部訪問全局變量,由于其作用域是全局的因此可以直接在Block內(nèi)部直接使用全局變量。Block內(nèi)部可以修改全局變量,同時全局變量在Block外部修改時,也會影響到Block內(nèi)部的值。

三、? Block分為哪幾種?為什么要用copy修飾?

Block按照它存在的內(nèi)存區(qū)分為棧塊、堆塊、全局塊。

1、? 全局塊:block內(nèi)部沒有訪問外部變量,這個block就會被存放在全局區(qū),成為全局塊;

2、 堆塊:存在于堆中,程序員自己管理生命周期;

3、 棧塊:存在于棧中,在超出作用域之后就會被自動銷毀,這樣可能會導(dǎo)致在block調(diào)用前,block就被自動銷毀了,因此,為了延長block的生命周期,ARC情況下會自動將棧塊復(fù)制到堆中,并讓原來的棧塊生成一個指針指向新的堆塊。

使用copy修飾符的作用就是將block從棧區(qū)拷貝到堆區(qū)。

四、循環(huán)引用





http://www.itdecent.cn/p/14efa33b3562

http://www.cocoachina.com/ios/20170503/19165.html

http://www.itdecent.cn/p/d28a5633b963

最后編輯于
?著作權(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)容