Block的介紹
block是將函數(shù)及其執(zhí)行上下文封裝起來的對象,block調(diào)用就是函數(shù)調(diào)用
block有三種類型NSGlobalBlock全局block 存儲在全局區(qū),NSMallocBlock堆區(qū)block,NSStackBlock棧區(qū)block
Block的內(nèi)存管理
block直接存儲在全局區(qū),如果block訪問外部變量并進行block相應(yīng)拷貝copy蔬螟,如果此時block是強引用存在堆區(qū),如果是弱引用存在棧區(qū)
Block的循環(huán)引用
self強持有block汽畴,block內(nèi)部強持有self
weak-strong-dance , __block 修飾對象,? 傳遞對象self作為block的參數(shù)旧巾,提供給block內(nèi)部使用,使用NSProxy子類代替self
截獲變量
全局變量 靜態(tài)全局變量不捕獲 直接取值整袁,局部變量是基本數(shù)據(jù)類型時菠齿,捕獲值佑吝,oc對象時 連同所有權(quán)修飾符一起捕獲坐昙,靜態(tài)變量時,捕獲其指針
__block修飾符
block 無法修改外界普通變量 用__block修飾可以捕獲到
__block修飾的變量是一個oc對象 有isa指針 內(nèi)部的__forwarding指針指向自己
新生成的__block變量在棧區(qū) 新創(chuàng)建的block也在棧區(qū)芋忿,
ARC下系統(tǒng)會把棧block copy到堆區(qū)炸客,內(nèi)部使用的__block變量也復(fù)制到堆區(qū),讓block強引用這個__block變量戈钢,并且讓__block變量的forwarding指針指向堆上面的__block變量