1.什么是block梦谜?
block是將函數(shù)
及其執(zhí)行上下文
封裝起來的對象
(底層有isa指針).
2.截獲變量
1.對于
基本數(shù)據(jù)
類型的局部變量
截獲其值
2.對于對象
類型的局部變量連同所有權(quán)修飾符
一起截獲房维、
3.以指針形式
截獲局部靜態(tài)變量
4.不截獲
全局變量叹括、靜態(tài)全局變量
3.__block修飾符
一般情況下
魂莫,對被截獲變量進(jìn)行賦值
操作需添加__block修飾符
不需要沐旨,因?yàn)閍rray對象的操作只有一個使用,沒有賦值噪伊。只有賦值的操作簿煌,我們才需要加上__block修飾符氮唯。
需要在array聲明的時候,加上__block修飾符姨伟。否則會編譯報錯惩琉。
- 因?yàn)閙ultiplier通過__block修飾之后,會變成一個對象授滓。
__block修飾的變量變成了對象
4.block的內(nèi)存管理琳水?
棧上一個block肆糕。進(jìn)行copy后般堆,會在堆上有一個一樣的block和__block變量,隨著變量作用域結(jié)束诚啃,棧上的block銷毀淮摔。在堆上的block仍然存在。如果在mrc環(huán)境下始赎,會造成內(nèi)存泄漏和橙。
如果棧上的block進(jìn)行了copy。會在堆上也有一份內(nèi)容造垛。實(shí)際上我們不是修改的棧上的__block的值魔招。而是通過棧上的__forwarding指針找到堆上的__block變量。然后對堆上的值進(jìn)行修改五辽。
如果堆上的__block變量由于被成員變量的block持有的話办斑。當(dāng)在其他地方調(diào)用__block修改的時候。會通過自身的__forwarding修改的杆逗。
__forwarding存在的意義乡翅?
不論在任何內(nèi)存位置,都可以順利的訪問同一個__block變量罪郊。
5.block真題蠕蚜。
在MRC下,不會產(chǎn)生循環(huán)引用悔橄。
在ARC下靶累,會產(chǎn)生循環(huán)引用,引起內(nèi)存泄漏癣疟。
如果一直不調(diào)用_blk的話尺铣。這個循環(huán)引用的環(huán)會一直存在。
6. delegate争舞,block的區(qū)別凛忿?
7.如何在block內(nèi)如何修改block外部變量竞川?
使用__block進(jìn)行修改店溢。
在block內(nèi)如何修改block外部變量引發(fā)的思考
8.block中的循環(huán)引用是怎么造成的叁熔?
一個對象中強(qiáng)引用了block,在block中又強(qiáng)引用了該對象床牧,就會發(fā)生循環(huán)引用荣回。
蘋果官方的建議是:傳進(jìn)block之前,把self轉(zhuǎn)換成weak automatic的變量戈咳,這樣在block中就不會出現(xiàn)對self的強(qiáng)引用心软。如果在block執(zhí)行完成之前,self被釋放著蛙,weakSelf也會置為nil删铃。weak類型相對比較安全,因?yàn)榭梢栽卺尫藕笞詣又脼閚il踏堡,不會引起野指針猎唁。
9.為什么系統(tǒng)的UIView的動畫,不需要處理循環(huán)引用問題顷蟆?
原理: UIView調(diào)用的是類方法诫隅,當(dāng)前控制器不可能強(qiáng)引用一個類 ,所以循環(huán)無法形成 --> 動畫block不會造成循環(huán)引用的原因帐偎。