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 修饰符 之后,就达到了我们的目的了,哈哈,是不是很神奇