Block介紹
- block 本質(zhì)上也是一個(gè) OC 對(duì)象既绕,它內(nèi)部也有個(gè) isa 指針
- block 是封裝了函數(shù)調(diào)用以及函數(shù)調(diào)用環(huán)境的 OC 對(duì)象
- block 是封裝函數(shù)及其上下文的 OC 對(duì)象
Block的三種類型
- _NSConcreteStackBlock:全局?jǐn)?shù)據(jù)區(qū)的 Block 對(duì)象刊殉,在棧上創(chuàng)建崖蜜。
- _NSConcreteMallocBlock:在堆上創(chuàng)建的 Block 對(duì)象
- _NSConcreteGlobalBlock:全局?jǐn)?shù)據(jù)區(qū)的 Block 對(duì)象
對(duì)三種Block對(duì)象分別進(jìn)行copy的結(jié)果為
- __NSGlobalBlock __ 調(diào)用 copy 操作后,什么也不做
- __NSMallocBlock __ 調(diào)用 copy 操作后衷笋,復(fù)制效果是:引用計(jì)數(shù)增加芳杏;副本存儲(chǔ)位置是堆
- _NSStackBlock __ 調(diào)用 copy 操作后,復(fù)制效果是:從棧復(fù)制到堆;副本存儲(chǔ)位置是堆
Block的類型如何界定爵赵?
NSGlobalBlock界定方法
- 不捕獲全局變量(包括全局靜態(tài)變量)
- 沒有捕獲變量或者捕獲的只有局部靜態(tài)變量
- 以指針形式截獲局部靜態(tài)變量
NSStackBlock
訪問了外部變量吝秕,但沒有強(qiáng)引用指向這個(gè)block
NSMallocBlock
訪問了外部變量而且有強(qiáng)引用指向該block(或者作為函數(shù)返回值)就會(huì)自動(dòng)將__NSStackBlock類型copy到堆上