Block局部变量快照功能

来源:互联网 发布:部落冲突蓝胖子数据 编辑:程序博客网 时间:2024/06/09 07:58
  1. 结论:
    block 的快照功能 (快照-保存之前瞬间变量的值,之后程序其他地方改变变量的值,block内该变量的值不改变)

    • 对block申明时外部局部变量起作用
    • -(void)test:(NSInteger )i 对于传递参数也具有快照功能
    • 对其外部成员变量不起作用
  2. 测试代码:

    • 对block申明时外部局部变量起作用
- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    _ioQueue = dispatch_queue_create("com.sohu-inc.ImageCache", DISPATCH_QUEUE_SERIAL);    //    a = @"0";    for (int i = 0 ; i < 5; i ++)    {        [self test:i];    }}-(void)test:(NSInteger )i{    NSString *a = @"0";    a = [NSString stringWithFormat:@"%ld",i];    NSLog(@"===test:%@",a);    dispatch_async(self.ioQueue, ^{        NSLog(@"block before test,%@",a);        sleep(1);        NSLog(@"block after test,%@",a);    });}

测试结果:

2016-05-10 16:46:59.682 ARCTest[3312:206422] ===test:02016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:12016-05-10 16:46:59.683 ARCTest[3312:206458] block before test,02016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:22016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:32016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:42016-05-10 16:47:00.687 ARCTest[3312:206458] block after test,02016-05-10 16:47:00.687 ARCTest[3312:206458] block before test,12016-05-10 16:47:01.691 ARCTest[3312:206458] block after test,12016-05-10 16:47:01.692 ARCTest[3312:206458] block before test,22016-05-10 16:47:02.693 ARCTest[3312:206458] block after test,22016-05-10 16:47:02.694 ARCTest[3312:206458] block before test,32016-05-10 16:47:03.699 ARCTest[3312:206458] block after test,32016-05-10 16:47:03.699 ARCTest[3312:206458] block before test,42016-05-10 16:47:04.705 ARCTest[3312:206458] block after test,4
  • -(void)test:(NSInteger )i 对于传递参数也具有快照功能
- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    _ioQueue = dispatch_queue_create("com.sohu-inc.ImageCache", DISPATCH_QUEUE_SERIAL);    //    a = @"0";    for (int i = 0 ; i < 20; i ++)    {        [self test:i];    }}-(void)test:(NSInteger )i{    NSString *a = @"0";    a = [NSString stringWithFormat:@"%ld",i];    NSLog(@"===test:%@",a);    dispatch_async(self.ioQueue, ^{        NSLog(@"block before test,%ld",i);        sleep(1);        NSLog(@"block after test,%ld",i);    });}
部分执行结果:
2016-05-10 13:12:40.691 ARCTest[1875:104044] ===test:02016-05-10 13:12:40.691 ARCTest[1875:104044] ===test:12016-05-10 13:12:40.691 ARCTest[1875:104084] block before test,02016-05-10 13:12:40.691 ARCTest[1875:104044] ===test:22016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:32016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:42016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:52016-05-10 13:12:41.692 ARCTest[1875:104084] block after test,02016-05-10 13:12:41.692 ARCTest[1875:104084] block before test,12016-05-10 13:12:42.698 ARCTest[1875:104084] block after test,12016-05-10 13:12:42.698 ARCTest[1875:104084] block before test,22016-05-10 13:12:43.700 ARCTest[1875:104084] block after test,22016-05-10 13:12:43.701 ARCTest[1875:104084] block before test,32016-05-10 13:12:44.706 ARCTest[1875:104084] block after test,32016-05-10 13:12:44.706 ARCTest[1875:104084] block before test,42016-05-10 13:12:45.712 ARCTest[1875:104084] block after test,42016-05-10 13:12:45.712 ARCTest[1875:104084] block before test,52016-05-10 13:12:46.714 ARCTest[1875:104084] block after test,5
  • 对其外部成员变量不起作用
- (void)viewDidLoad {    [super viewDidLoad];    // Do any additional setup after loading the view, typically from a nib.    _ioQueue = dispatch_queue_create("com.sohu-inc.ImageCache", DISPATCH_QUEUE_SERIAL);    a = @"0";    for (int i = 0 ; i < 5; i ++)    {        [self test:i];    }}-(void)test:(NSInteger )i{    a = [NSString stringWithFormat:@"%ld",i];    NSLog(@"===test:%@",a);    dispatch_async(self.ioQueue, ^{        NSLog(@"block before test,%@",a);        sleep(1);        NSLog(@"block after test,%@",a);    });}

测试结果:

2016-05-10 16:49:56.233 ARCTest[3329:209776] ===test:02016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:12016-05-10 16:49:56.234 ARCTest[3329:209848] block before test,12016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:22016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:32016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:42016-05-10 16:49:57.239 ARCTest[3329:209848] block after test,42016-05-10 16:49:57.239 ARCTest[3329:209848] block before test,42016-05-10 16:49:58.244 ARCTest[3329:209848] block after test,42016-05-10 16:49:58.244 ARCTest[3329:209848] block before test,42016-05-10 16:49:59.248 ARCTest[3329:209848] block after test,42016-05-10 16:49:59.248 ARCTest[3329:209848] block before test,42016-05-10 16:50:00.250 ARCTest[3329:209848] block after test,42016-05-10 16:50:00.250 ARCTest[3329:209848] block before test,42016-05-10 16:50:01.253 ARCTest[3329:209848] block after test,4
0 0
原创粉丝点击