什么是Block
截獲變量
__block修飾符
內(nèi)存管理
循環(huán)引用
什么是Block?
將函數(shù)及其執(zhí)行上下文封裝起來的對(duì)象。
- 函數(shù)
- 上下文
- 對(duì)象
源碼實(shí)現(xiàn),看結(jié)構(gòu)體
*block的本質(zhì)和函數(shù)調(diào)用
截獲變量
- 局部變量
- 基本數(shù)據(jù)類型
截回其置 - 對(duì)象類型
連同所有權(quán)修飾符一起截獲
- 靜態(tài)局部變量
以指針形式截回 - 全局變量
不截獲 - 靜態(tài)全局變量
不截獲
__block修飾符
一般情況下,對(duì)被截獲的變量賦值操作時(shí)候使用__block修飾(賦值: 注意數(shù)組)
否則的話就會(huì)編譯報(bào)錯(cuò)
對(duì)變量進(jìn)行賦值時(shí)候的特點(diǎn)
需要__block修飾符 ===> 局部變量(基本數(shù)據(jù)類型和對(duì)象類型)
不需要__block修飾符 ===> 靜態(tài)局部變量、全局變量、靜態(tài)全局變量__block修飾符的變量變成了對(duì)象
__forwarding指針是用來干什么的?
Block的內(nèi)存管理
imp.isa = &_NSConcertStackBlock
copy操作
棧上 堆上
堆上 增加其引用計(jì)數(shù)
數(shù)據(jù)區(qū) 什么也不做
棧上Block銷毀
變量和block都會(huì)被銷毀棧上Block的Copy
堆上有對(duì)應(yīng)的的block和__block變量都會(huì)銷毀
- 棧上Block的Copy又發(fā)生了什么
棧上Block變量的__forwaording指針指向的自己,copy之后,棧上的__foewarding指針指向堆上的__block變量
- __forwaordig總結(jié)
- __forwaordig存在意義
都可以順利的額訪問同一個(gè)__block變量
block的循環(huán)應(yīng)用
__weak避免產(chǎn)生循環(huán)應(yīng)用
為什么用__weak可以呢?應(yīng)為截獲成員變量是對(duì)象時(shí)候,是對(duì)其修飾符所有權(quán)一起引用的
Block總結(jié)
什么是block?
為什么block會(huì)產(chǎn)生循環(huán)引用?
(截獲后會(huì)有強(qiáng)引用,__block下要看是ARC還是MRC)
怎么理解block截獲變量的特性?
遇到那些循環(huán)應(yīng)用,怎么解決的?