很簡(jiǎn)單贮尖,分兩種情況。
第一種情況燃逻,該變量沒(méi)有__block修飾闷袒。此時(shí)block截獲的是block定義處對(duì)該變量的一份瞬時(shí)拷貝坑律,此后block外的這個(gè)變量與block內(nèi)截獲的拷貝相互獨(dú)立,再?zèng)]有半毛錢關(guān)系囊骤。變量值改變不會(huì)影響拷貝的值晃择,也就是說(shuō)block執(zhí)行時(shí)使用的是當(dāng)時(shí)拷貝的值冀值。如果試圖在block內(nèi)對(duì)該拷貝進(jìn)行賦值,編譯器會(huì)報(bào)錯(cuò)宫屠。
執(zhí)行結(jié)果:
試圖對(duì)拷貝的量賦值會(huì)報(bào)錯(cuò)
第二種情況池摧,該變量有__block修飾。此時(shí)block截獲的是該變量的真身激况。block執(zhí)行時(shí)使用的是執(zhí)行時(shí)該變量的值,而不是block定義時(shí)該變量的值膘魄∥谥穑可以在block內(nèi)改變?cè)撟兞康闹担沂菍?shí)實(shí)在在地改變了該變量的值创葡。
執(zhí)行結(jié)果:
注意一個(gè)變量表示的是對(duì)象時(shí)浙踢,該變量的值實(shí)際上是指針值。若沒(méi)有__block修飾灿渴,則可以通過(guò)該指針值改變其指向的對(duì)象洛波,但是不能改變?cè)撝羔樀闹怠H粲衉_block修飾骚露,則既可改變對(duì)象值蹬挤,也可改變指針值。
block在一個(gè)類里面定義時(shí)棘幸,可以對(duì)類的實(shí)例變量隨意賦值焰扳,即便實(shí)例變量沒(méi)有__block修飾,因?yàn)閎lock截獲的實(shí)例變量前省略了self误续,block捕獲的實(shí)際是self指針吨悍。
另外,block不能截獲C語(yǔ)言數(shù)組蹋嵌。試圖截獲數(shù)組會(huì)報(bào)錯(cuò)育瓜。數(shù)組與指針聯(lián)系密切,盡量將變量定義為指針栽烂,而不要定義為數(shù)組躏仇。