Block 拷贝或者捕获的是指针指向的内存地址,还是指针地址

2018-01-27  本文已影响65人  柠檬草YF

让我们通过例子来验证一下我们的猜想。
猜想例子方案:

block 先捕获指针,在给指针赋值,然后调用block,在block 打印指针的值

可能的两个结论
结论1:打印出 block捕获前指针的值
结论2:打印出 block捕获后指针的值

  NSMutableArray *array = nil;;
  void(^block)(void) = ^{
      NSLog(@"%@",array);
  };
  array = @[@"1",@"2",@"3"].mutableCopy;
  block();

打印结果:== 结论1

(null)
 NSMutableArray *array = @[@"1",@"2",@"3"].mutableCopy;
 void(^block)(void) = ^{
     NSLog(@"%@",array);
 };
  block();

打印结果:== 结论1

(
    1,
    2,
    3
)

由此可见,block 捕获的是 block 实现时指针指向的内存地址,实现block 之后的指针指向别的内存地址,block 都不会改变,

结论: block 捕获的是指针指向的内存地址

那么有没有办法让block 捕获指针的地址呢,不管指针什么时候指向什么内存,我block都需要得到这个指针指向的内存地址???
binggo,没有我说个锤子!!!!

__block 的应用

 __block NSMutableArray *array = nil;
 void(^block)(void) = ^{
      NSLog(@"%@",array);
 };
 array = @[@"1",@"2",@"3"].mutableCopy;
 block();

打印结果:==结论2

(
    1,
    2,
    3
)

加上 __block 修饰符 之后,就达到了我们的目的了,哈哈,是不是很神奇

上一篇下一篇

猜你喜欢

热点阅读