MRC中分為
* NSConcreteGlobalBlock 全局靜態(tài)block察纯,不會訪問任何外部變量
* NSConcreteStackBlock 保存在棧上的block,函數(shù)返回時會被銷毀,編譯器自動管理(棧內(nèi)存特點(diǎn)),在MRC模式下初始化之后的非全局靜態(tài)block都是這種類型,所以需要說明的是,MRC模式下菩鲜,對于block的引用應(yīng)該用copy,這樣該block就會轉(zhuǎn)變成下面這種類型
* NSConcreteMallocBlock 保存在堆上的block扯键,程序管理生命周期睦袖,引用計數(shù)為0時才會被銷毀。MRC下的棧上block被copy時被copy到堆上荣刑,變?yōu)镸allocBlock馅笙。
ARC中去掉了NSConcreteStackBlock,默認(rèn)block即為NSConcreteMallocBlock厉亏《埃可能蘋果覺得ARC的內(nèi)存管理能力足夠強(qiáng)大,釋放足夠及時爱只,堆上內(nèi)存如果釋放及時皿淋,還是有很大優(yōu)勢的,畢竟空間和引用管理比較方便
block對外部變量的使用有一個capture機(jī)制恬试,其實(shí)質(zhì)是將其copy進(jìn)相關(guān)struct中供block使用的窝趣,內(nèi)部修改不會影響外部。
如果需要影響外部训柴,則變量申明為_block關(guān)鍵字即可哑舒,這樣內(nèi)部對該變量的實(shí)用變成了指針引用。
以上說明適用于分配在棧上的變量幻馁,對于堆上的指針變量天生就能修改原值洗鸵,但是需要注意:
* 防止循環(huán)引用
* 防止野指針
1. 防止循環(huán)引用可以用__weak關(guān)鍵字聲明指針
2. 防止野指針可以在block內(nèi)部對其指針引用技術(shù)+1越锈,結(jié)束之后-1(MRC),或者可以在block內(nèi)部使用__strong關(guān)鍵字聲明指針指向外部用__weak聲明的變量
對于第二點(diǎn)可能有同學(xué)說膘滨,我平時沒這么聲明也沒問題啊甘凭,是的,這需要前提火邓,外部函數(shù)所屬的對象的生命周期比block要長丹弱,否則就會因?yàn)橐昧艘爸羔榗rash了
火車上不方便補(bǔ)代碼,回頭補(bǔ)上代碼例子