1.不可變類型的屬性
test1 中 block 里使用
_nameArr
實際上是self.nameArr
, 這里 block 拷貝的是指針 self, 用 self' 表示, 而 self' 和 self 指向同一塊內存,故 2s 后打印的_nameArr
是已經改變了指向的新的數組。
...
@property (nonatomic, strong) NSArray *nameArr;
...
- (void)test1 {
_nameArr = @[@"Penny", @"Amy"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"_nameArr: %@", _nameArr);
});
_nameArr = @[@"Sheldon", @"Leonard"];
}
.
.
2017-03-15 15:41:08.788189 BlockTest[4610:1392720] _nameArr: (
Sheldon,
Leonard
)
2.不可變類型的局部變量
test2 中 block 拷貝了
tempArr
指針, 2s 后打印的還是這個拷貝的指針指向的內容,即原內容,而外部的tempArr
實際上已經改變了指向,這里tempArr
原先指向的內存將在 block 執行完畢后釋放。
- (void)test2 {
NSArray *tempArr = @[@"Penny", @"Amy"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"tempArr: %@", tempArr);
});
tempArr = @[@"Sheldon", @"Leonard"];
}
.
.
2017-03-15 15:48:54.515345 BlockTest[4616:1393958] tempArr: (
Penny,
Amy
)
3.可變類型的屬性
test3 同 test1, 只不過 2s 后打印的是增加了數據的原數組。
...
@property (nonatomic, strong) NSMutableArray *mutableNameArr;
...
- (void)test3 {
_mutableNameArr = [NSMutableArray arrayWithArray:@[@"Penny", @"Amy"]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mutableNameArr: %@", _mutableNameArr);
});
[_mutableNameArr addObject:@"Bernadette"];
}
.
.
2017-03-15 15:53:23.541348 BlockTest[4620:1394686] mutableNameArr: (
Penny,
Amy,
Bernadette
)
4.可變類型的局部變量
test4 中 block 拷貝了
mutableTempArr
指針, 外部的mutableTempArr
并沒有改變指向,只是添加了一個數據,故 2s 后 block 中拷貝的指針指向的這同一塊內存是已經添加了數據的原數組。
- (void)test4 {
NSMutableArray *mutableTempArr = [NSMutableArray arrayWithArray:@[@"Penny", @"Amy"]];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"mutableTempArr: %@", mutableTempArr);
});
[mutableTempArr addObject:@"Bernadette"];
}
2017-03-15 15:56:55.511302 BlockTest[4626:1395731] mutableTempArr: (
Penny,
Amy,
Bernadette
)
5.基本數據類型局部變量
test5 test6 演示了加了 __block 修飾的變量在外部修改了,那么 block 內部也可見,當然,在 block 內部修改了,外部也可見。
- (void)test5 {
NSInteger i = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"i: %ld", i);
});
i = 1;
}
.
.
2017-03-15 16:01:08.140533 BlockTest[4632:1396576] i: 0
6.加__block的基本數據類型局部變量
- (void)test6 {
__block NSInteger i = 0;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"i: %ld", i);
});
i = 1;
}
.
.
2017-03-15 16:03:33.550104 BlockTest[4640:1397522] i: 1