block的相關(guān)記錄
block在創(chuàng)建的時候衰齐,它的內(nèi)存是分配在棧上的,所以說block本身的作于域是屬于創(chuàng)建時候的作用域萝勤,一旦在創(chuàng)建時候的作用域外面調(diào)用block將導(dǎo)致程序崩潰露筒。因為棧區(qū)的特點就是創(chuàng)建的對象隨時可能被銷毀,一旦被銷毀后續(xù)再次調(diào)用空對象就可能會造成程序崩潰,用copy修飾敌卓,把block從棧中拷貝到堆中慎式,防止被釋放。
block有3種類型:
_NSConcreteGlobalBlock:全局的靜態(tài) block趟径,類似函數(shù)瘪吏。如果block里不獲取任何外部變量∥锨桑或者的變量是全局作用域時掌眠,如成員變量、屬性等幕屹; 這個時候就是Global類型
_NSConcreteStackBlock:保存在棧中的 block蓝丙,棧都是由系統(tǒng)管理內(nèi)存,當(dāng)函數(shù)返回時會被銷毀望拖。__block類型的變量也同樣被銷毀渺尘。為了不被銷毀,block會將block和_block變量從椝得簦拷貝到堆鸥跟。
_NSConcreteMallocBlock:保存在堆中的 block,堆內(nèi)存可以由開發(fā)人員來控制像云。當(dāng)引用計數(shù)為 0 時會被銷毀锌雀。
block使用時的注意事項
1.block訪問局部變量時,相當(dāng)于是值拷貝迅诬,不能修改只能訪問
2.當(dāng)局部變量被__block修飾時腋逆,相當(dāng)于block也引用了這個外部的值,這個值是可以修改的
3.全局變量是可以在block中修改的侈贷。
block的相關(guān)疑問
1.為什么局部變量的值要用__block修飾才能在block里面被修改惩歉?
因為局部變量的值在出了作用域時就會被銷毀等脂,但被_block修飾的時候,相當(dāng)于block引用了它撑蚌,所以就不會被釋放了
2.block 里 strong self 后上遥,block 不是也會持有 self 嗎?而 self 又持有 block 争涌,那不是又循環(huán)引用了粉楚?
在block里用strong引用,保證了持有引用的周期只在 block被執(zhí)行時亮垫,閉包函數(shù)返回后就釋放了模软。而直接用強引用,持有引用的周期則是block的生命周期饮潦,就會循環(huán)引用了燃异。
3.為什么block不用strong修飾符 而是copy?
strong修飾的block继蜡,系統(tǒng)默認(rèn)的處理方式也是copy回俐。 但是為了保證行為和修飾符一樣,所以建議使用copy的修飾符稀并。
4.為什么@strongify(self) 和 @weakify(self) 要配套使用仅颇?
因為這樣可以防止我們在block中使用self時,self出現(xiàn)提前釋放的問題碘举。我們在block中使用strongify(self)就能保證在這個block的回調(diào)執(zhí)行完之前self是不會被釋放的灵莲。