注:本文集為自己準(zhǔn)備面試時(shí)逛拱,系統(tǒng)復(fù)習(xí)的筆記敌厘,如大家有興趣台猴,歡迎閱讀并指正
1.block有傳值和傳地址朽合,局部變量是傳值,如果加了__block修飾的局部變量變?yōu)閭鞯刂?/p>
- block沒(méi)有訪問(wèn)外部變量饱狂,即為全局區(qū)
1.MRC下訪問(wèn)了外部變量為棧區(qū)曹步,使用copy進(jìn)入堆區(qū)
2.ARC下訪問(wèn)了外部變量為堆區(qū) - __weak解決block的循環(huán)引用
- 如果block內(nèi)部調(diào)用了延時(shí)函數(shù),需要在block內(nèi)部強(qiáng)引用下
1.什么是block休讳?
block是將函數(shù)及其執(zhí)行上下文封裝起來(lái)的對(duì)象讲婚。
2.截獲變量
局部變量
- 基本數(shù)據(jù)類型。值傳遞
- 對(duì)象類型俊柔。對(duì)于對(duì)象類型的局部變量連同所有權(quán)修飾符一起截獲筹麸。值傳遞
靜態(tài)局部變量。指針截獲
全局變量雏婶。不截獲
靜態(tài)全局變量酵紫。不截獲
3.__block修飾符
- 一般情況下橄唬,對(duì)截獲變量進(jìn)行賦值操作需要添加__block修飾符。
- 靜態(tài)局部變量缸血、全局變量、靜態(tài)全局變量不需要__block修飾符。
- __block修飾的變量變成了對(duì)象赤赊。棧上的__forwarding指向自己。棧block經(jīng)copy到堆block瘦陈,棧上的__forwarding 指向堆block的__block變量;堆上的__forwarding指向的是自己__block變量
- __forwarding的總結(jié)
不論在任何內(nèi)存位置,都可以通過(guò)__forwarding順利的訪問(wèn)同一個(gè)__block變量
4.Block的內(nèi)存管理
全局Block
copy趁窃,什么也不做堆區(qū)block
copy,增加引用計(jì)數(shù)棧區(qū)Block
copy检碗,堆區(qū)copy棧上Block的銷(xiāo)毀
5.block的引用循環(huán)
__weak進(jìn)行解決。截獲局部變量對(duì)象怕犁,會(huì)連同修飾符一起截獲。