/*
如果【block内部】使用【外部声明的强引用】访问【对象A】, 那么【block内部】会自动产生一个【强引用】指向【对象A】
如果【block内部】使用【外部声明的弱引用】访问【对象A】, 那么【block内部】会自动产生一个【弱引用】指向【对象A】
*/
在blockA内创建的指针变量,不执行,且不会被另外的blockB(如A{B}等)使用时,不会被创建
- 强引用保证代码块执行对象不死,然后转变强引用作用域,使强引用可以销毁,对象不会一直被循环引用,所以会死
- 1
先用弱指针引入(强指针self)外部变量 ,然后用强引用=外部弱引用的代码(强引用为局部变量,block块执行完,自动销毁),所以(如果对象没死之前执行了block,使得强引用产生,然后)block,没执行完,对象循环引用,不死,执行完不会循环引用就死
{
YSPerson *p = [[YSPerson alloc] init];
__weak YSPerson *weakP = p;
p.name = @"Jack";
p.block = ^{ // block1
NSLog(@"beign-------");
YSPerson *strongP = weakP;//这句会不会被执行到是关键,没执行,block内没有强指针指向对象p,执行了就有..(在2中,由于block2,引用了strongP,所以会在block创建的时候就执行,否则(就像这里)要执行block才会来到这里执行代码,强引用=外部弱引用的代码)
};
p.block();
}
1补充
代码块不执行,,也能销毁对象
强引用=外部弱引用的代码,不被执行,强引用不会产生(除非2中另有block引用了),所以对象会销毁-
另外扩展
- block1被执行时对象没死,block2执行时,对象已死,因为强引用=外部弱引用的代码,不被执行,强引用不会产生,所以对象会销毁
![image](images/屏幕快照 2015-11-24 17.29.15.png)
- block1被执行时对象没死,block2执行时,对象已死,因为强引用=外部弱引用的代码,不被执行,强引用不会产生,所以对象会销毁
- 2(self指定p对象,p.block为block1,鼠标所在block为block2)
先用弱指针引入(强指针self)外部变量 ,然后用强引用(局部变量,block块执行完,自动销毁),所以(如果blockA内又来一个blockB引入A中强引用,马上copy一份(不用执行)指向self对象)blockA,没执行完,对象循环引用,不死,执行完不会循环,但还有blockB引用对象执行完b就死(blockB是一个定制任务,执行完系统自动释放,或者是其他的对象的block,有别人控制blockB的执行和销毁,,但B和self对象不存在循环引用,导致无法销毁内存泄露的问题)
![image](images/屏幕快照 2015-11-24 22.34.32.png)
这里block2,没有强指针指向p,block1执行完,指向p的强指针都被销毁,对象p死
弱指针特性,指向内存空间的对象被释放了,自动赋值为nil,强指针没有这个特性,指向内存空间的对象被释放了,仍会指向被释放的内存,造成坏内存访问错误,僵尸对象.
![image](images/屏幕快照 2015-11-24 17.43.10.png)
Zzz
block内部
引用外部变量,,block创建就copy一分外面的变量镜像,,(效果相当于在外面创建的)内部自定义的,要执行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,所以对象不会被释放,循环引用了