block02

2015-12-22  本文已影响49人  沁晓Chr
   /*
     如果【block内部】使用【外部声明的强引用】访问【对象A】, 那么【block内部】会自动产生一个【强引用】指向【对象A】
     如果【block内部】使用【外部声明的弱引用】访问【对象A】, 那么【block内部】会自动产生一个【弱引用】指向【对象A】
     */
     在blockA内创建的指针变量,不执行,且不会被另外的blockB(如A{B}等)使用时,不会被创建
{
   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();
}
imageimage

![image](images/屏幕快照 2015-11-24 22.34.32.png)
这里block2,没有强指针指向p,block1执行完,指向p的强指针都被销毁,对象p死
弱指针特性,指向内存空间的对象被释放了,自动赋值为nil,强指针没有这个特性,指向内存空间的对象被释放了,仍会指向被释放的内存,造成坏内存访问错误,僵尸对象.
![image](images/屏幕快照 2015-11-24 17.43.10.png)

block中对外部变量的引用是层层copy的

比如 
A
BlockB{ BlockC{ A} }

对A的引用B和C中都有copy映像

上一篇 下一篇

猜你喜欢

热点阅读