block02

   /*
     如果【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)
  • 2(self指定p对象,p.block为block1,鼠标所在block为block2)
    先用弱指针引入(强指针self)外部变量 ,然后用强引用(局部变量,block块执行完,自动销毁),所以(如果blockA内又来一个blockB引入A中强引用,马上copy一份(不用执行)指向self对象)blockA,没执行完,对象循环引用,不死,执行完不会循环,但还有blockB引用对象执行完b就死(blockB是一个定制任务,执行完系统自动释放,或者是其他的对象的block,有别人控制blockB的执行和销毁,,但B和self对象不存在循环引用,导致无法销毁内存泄露的问题)
image
image

![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,所以对象不会被释放,循环引用了

你可能感兴趣的:(block02)