__block在block外面
__block int a = 5;
NSLog(@"第一次打印%d",a);
[UIView animateWithDuration:0.1 animations:^{
NSLog(@"第二次打印%d",a);
a = 10;
NSLog(@"第三次打印%d",a);
}];
NSLog(@"第四次打印%d",a);
a = 15;
NSLog(@"第五次打印%d",a);
//打印结果:
//2016-05-19 15:03:27.196 blockTest[6265:159275] 第一次打印5
//2016-05-19 15:03:27.197 blockTest[6265:159275] 第二次打印5
//2016-05-19 15:03:27.197 blockTest[6265:159275] 第三次打印10
//2016-05-19 15:03:27.197 blockTest[6265:159275] 第四次打印10
//2016-05-19 15:03:27.197 blockTest[6265:159275] 第五次打印15
从打印结果可以看出__block加在block的外面时,能改变block内部的变量的值(外部声明过的),且在block内部改变过的变量值,能够赋给block外部变量。
__block在block里面
int a = 5;
NSLog(@"第一次打印%d",a);
[UIView animateWithDuration:0.1 animations:^{
NSLog(@"第二次打印%d",a);
__block int a = 10;
NSLog(@"第三次打印%d",a);
}];
NSLog(@"第四次打印%d",a);
a = 15;
NSLog(@"第五次打印%d",a);
//打印结果
//2016-05-19 15:15:17.716 blockTest[6297:163792] 第一次打印5
//2016-05-19 15:15:17.716 blockTest[6297:163792] 第二次打印5
//2016-05-19 15:15:17.716 blockTest[6297:163792] 第三次打印10
//2016-05-19 15:15:17.716 blockTest[6297:163792] 第四次打印5
//2016-05-19 15:15:17.717 blockTest[6297:163792] 第五次打印15
从打印结果可以看出__block加在block里面时,虽然能够改变block内部变量的值,但是不能再赋给block外部变量,也就意味着block内部修改过的变量值只能在内部用,在外部用时,值依然是没进block时的值,这个具体情况具体分析,自己看着办。
__block在block外面和在block里面总结
可以看作只要加了__block就能在block内部修改外部变量的值,且最后变量的值以第一次出现它的地方为准,中途有变动值就变为中途赋的值。