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