结论:
block 的快照功能 (快照-保存之前瞬间变量的值,之后程序其他地方改变变量的值,block内该变量的值不改变)- 对block申明时外部局部变量起作用
- -(void)test:(NSInteger )i 对于传递参数也具有快照功能
- 对其外部成员变量不起作用
测试代码:
- 对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:0
2016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:1
2016-05-10 16:46:59.683 ARCTest[3312:206458] block before test,0
2016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:2
2016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:3
2016-05-10 16:46:59.683 ARCTest[3312:206422] ===test:4
2016-05-10 16:47:00.687 ARCTest[3312:206458] block after test,0
2016-05-10 16:47:00.687 ARCTest[3312:206458] block before test,1
2016-05-10 16:47:01.691 ARCTest[3312:206458] block after test,1
2016-05-10 16:47:01.692 ARCTest[3312:206458] block before test,2
2016-05-10 16:47:02.693 ARCTest[3312:206458] block after test,2
2016-05-10 16:47:02.694 ARCTest[3312:206458] block before test,3
2016-05-10 16:47:03.699 ARCTest[3312:206458] block after test,3
2016-05-10 16:47:03.699 ARCTest[3312:206458] block before test,4
2016-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:0
2016-05-10 13:12:40.691 ARCTest[1875:104044] ===test:1
2016-05-10 13:12:40.691 ARCTest[1875:104084] block before test,0
2016-05-10 13:12:40.691 ARCTest[1875:104044] ===test:2
2016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:3
2016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:4
2016-05-10 13:12:40.692 ARCTest[1875:104044] ===test:5
2016-05-10 13:12:41.692 ARCTest[1875:104084] block after test,0
2016-05-10 13:12:41.692 ARCTest[1875:104084] block before test,1
2016-05-10 13:12:42.698 ARCTest[1875:104084] block after test,1
2016-05-10 13:12:42.698 ARCTest[1875:104084] block before test,2
2016-05-10 13:12:43.700 ARCTest[1875:104084] block after test,2
2016-05-10 13:12:43.701 ARCTest[1875:104084] block before test,3
2016-05-10 13:12:44.706 ARCTest[1875:104084] block after test,3
2016-05-10 13:12:44.706 ARCTest[1875:104084] block before test,4
2016-05-10 13:12:45.712 ARCTest[1875:104084] block after test,4
2016-05-10 13:12:45.712 ARCTest[1875:104084] block before test,5
2016-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:0
2016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:1
2016-05-10 16:49:56.234 ARCTest[3329:209848] block before test,1
2016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:2
2016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:3
2016-05-10 16:49:56.234 ARCTest[3329:209776] ===test:4
2016-05-10 16:49:57.239 ARCTest[3329:209848] block after test,4
2016-05-10 16:49:57.239 ARCTest[3329:209848] block before test,4
2016-05-10 16:49:58.244 ARCTest[3329:209848] block after test,4
2016-05-10 16:49:58.244 ARCTest[3329:209848] block before test,4
2016-05-10 16:49:59.248 ARCTest[3329:209848] block after test,4
2016-05-10 16:49:59.248 ARCTest[3329:209848] block before test,4
2016-05-10 16:50:00.250 ARCTest[3329:209848] block after test,4
2016-05-10 16:50:00.250 ARCTest[3329:209848] block before test,4
2016-05-10 16:50:01.253 ARCTest[3329:209848] block after test,4