/*
如果【block內(nèi)部】使用【外部聲明的強引用】訪問【對象A】, 那么【block內(nèi)部】會自動產(chǎn)生一個【強引用】指向【對象A】
如果【block內(nèi)部】使用【外部聲明的弱引用】訪問【對象A】, 那么【block內(nèi)部】會自動產(chǎn)生一個【弱引用】指向【對象A】
*/
在blockA內(nèi)創(chuàng)建的指針變量,不執(zhí)行,且不會被另外的blockB(如A{B}等)使用時,不會被創(chuàng)建
- 強引用保證代碼塊執(zhí)行對象不死,然后轉(zhuǎn)變強引用作用域,使強引用可以銷毀,對象不會一直被循環(huán)引用,所以會死
- 1
先用弱指針引入(強指針self)外部變量 ,然后用強引用=外部弱引用的代碼(強引用為局部變量,block塊執(zhí)行完,自動銷毀),所以(如果對象沒死之前執(zhí)行了block,使得強引用產(chǎn)生,然后)block,沒執(zhí)行完,對象循環(huán)引用,不死,執(zhí)行完不會循環(huán)引用就死
{
YSPerson *p = [[YSPerson alloc] init];
__weak YSPerson *weakP = p;
p.name = @"Jack";
p.block = ^{ // block1
NSLog(@"beign-------");
YSPerson *strongP = weakP;//這句會不會被執(zhí)行到是關(guān)鍵,沒執(zhí)行,block內(nèi)沒有強指針指向?qū)ο髉,執(zhí)行了就有..(在2中,由于block2,引用了strongP,所以會在block創(chuàng)建的時候就執(zhí)行,否則(就像這里)要執(zhí)行block才會來到這里執(zhí)行代碼,強引用=外部弱引用的代碼)
};
p.block();
}
1補充
代碼塊不執(zhí)行,,也能銷毀對象
強引用=外部弱引用的代碼,不被執(zhí)行,強引用不會產(chǎn)生(除非2中另有block引用了),所以對象會銷毀-
另外擴展
- block1被執(zhí)行時對象沒死,block2執(zhí)行時,對象已死,因為強引用=外部弱引用的代碼,不被執(zhí)行,強引用不會產(chǎn)生,所以對象會銷毀
![image](images/屏幕快照 2015-11-24 17.29.15.png)
- block1被執(zhí)行時對象沒死,block2執(zhí)行時,對象已死,因為強引用=外部弱引用的代碼,不被執(zhí)行,強引用不會產(chǎn)生,所以對象會銷毀
- 2(self指定p對象,p.block為block1,鼠標所在block為block2)
先用弱指針引入(強指針self)外部變量 ,然后用強引用(局部變量,block塊執(zhí)行完,自動銷毀),所以(如果blockA內(nèi)又來一個blockB引入A中強引用,馬上copy一份(不用執(zhí)行)指向self對象)blockA,沒執(zhí)行完,對象循環(huán)引用,不死,執(zhí)行完不會循環(huán),但還有blockB引用對象執(zhí)行完b就死(blockB是一個定制任務(wù),執(zhí)行完系統(tǒng)自動釋放,或者是其他的對象的block,有別人控制blockB的執(zhí)行和銷毀,,但B和self對象不存在循環(huán)引用,導(dǎo)致無法銷毀內(nèi)存泄露的問題)
![image](images/屏幕快照 2015-11-24 22.34.32.png)
這里block2,沒有強指針指向p,block1執(zhí)行完,指向p的強指針都被銷毀,對象p死
弱指針特性,指向內(nèi)存空間的對象被釋放了,自動賦值為nil,強指針沒有這個特性,指向內(nèi)存空間的對象被釋放了,仍會指向被釋放的內(nèi)存,造成壞內(nèi)存訪問錯誤,僵尸對象.
![image](images/屏幕快照 2015-11-24 17.43.10.png)
Zzz
block內(nèi)部
引用外部變量,,block創(chuàng)建就copy一分外面的變量鏡像,,(效果相當于在外面創(chuàng)建的)內(nèi)部自定義的,要執(zhí)行block才會有.最后
block中對外部變量的引用是層層copy的
比如
A
BlockB{ BlockC{ A} }
對A的引用B和C中都有copy映像
- 例子
![image](images/屏幕快照 2015-11-24 17.35.21.png)
對象未被釋放,因為block中對外部變量的引用是層層copy的,所以在block2中用了p.name,block1,中也有了p對象的強引用copy了,而p又強引用了block1,所以對象不會被釋放,循環(huán)引用了