block小結(jié)

block(代碼塊)實際上就是oc語言對于閉包的實現(xiàn)。

在oc中,主要有三種類型的block:

1._NSConcreteGlobalBlock 全局的靜態(tài) block,不會訪問任何外部變量。

2._NSConcreteStackBlock 保存在棧中的 block,當(dāng)函數(shù)返回時會被銷毀。

3._NSConcreteMallocBlock 保存在堆中的 block,當(dāng)引用計數(shù)為 0 時會被銷毀。

三種block的生成:

_NSConcreteGlobalBlock類型的block要么是空block,要么是不訪問任何外部變量的block。它既不在棧中,也不在堆中。

_NSConcreteStackBlock類型的block有閉包行為,也就是有訪問外部變量,并且該block只且只有有一次執(zhí)行,因為棧中的空間是可重復(fù)使用的,所以當(dāng)棧中的block執(zhí)行一次之后就被清除出棧了,所以無法多次使用。

_NSConcreteMallocBlock類型的block有閉包行為,并且該block需要被多次執(zhí)行。當(dāng)需要多次執(zhí)行時,就會把該block從棧中復(fù)制到堆中,供以多次執(zhí)行。

在oc中使用時,大多都是保存在堆中的block。

關(guān)于 block 造成循環(huán)引用的問題:

循環(huán)引用:當(dāng)兩個對象都持有彼此而不能釋放,導(dǎo)致內(nèi)存泄漏即為循環(huán)引用。

概括起來說:只有block間接或直接被當(dāng)前控制器持有,block內(nèi)部使用時才應(yīng)該用weakself,若當(dāng)前控制器不持有block,在內(nèi)部使用self并不會造成循環(huán)引用。

當(dāng)在block內(nèi)需要多次調(diào)用weak self時,有可能因為weak self被置為nil而導(dǎo)致crash,比如:在block中需要再開啟一個線程調(diào)用self方法,若此時使用weak self有可能weak self已經(jīng)被銷毀了,而不能調(diào)用。這種情況需要配合使用strongself來避免。

block修改外部變量的值:

默認情況下,block不允許修改外部變量的值,這里所說的外部變量的值,指的是棧中指針的內(nèi)存地址。

想要修改外部變量的值,就必須使用__block來修飾。而__block 所起到的作用就是只要觀察到該變量被 block 所持有,就將“外部變量”在棧中的內(nèi)存地址放到了堆中。進而在block內(nèi)部也可以修改外部變量的值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容