關(guān)于Block對(duì)變量的拷貝

1.不可變類(lèi)型的屬性

test1block 里使用 _nameArr 實(shí)際上是 self.nameArr, 這里 block 拷貝的是指針 self, 用 self' 表示, 而 self'self 指向同一塊內(nèi)存,故 2s 后打印的 _nameArr 是已經(jīng)改變了指向的新的數(shù)組。

...
@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.不可變類(lèi)型的局部變量

test2block 拷貝了 tempArr指針, 2s 后打印的還是這個(gè)拷貝的指針指向的內(nèi)容,即原內(nèi)容,而外部的 tempArr 實(shí)際上已經(jīng)改變了指向,這里 tempArr 原先指向的內(nèi)存將在 block 執(zhí)行完畢后釋放。

- (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.可變類(lèi)型的屬性

test3test1, 只不過(guò) 2s 后打印的是增加了數(shù)據(jù)的原數(shù)組。

...
@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.可變類(lèi)型的局部變量

test4block 拷貝了 mutableTempArr 指針, 外部的 mutableTempArr 并沒(méi)有改變指向,只是添加了一個(gè)數(shù)據(jù),故 2s 后 block 中拷貝的指針指向的這同一塊內(nèi)存是已經(jīng)添加了數(shù)據(jù)的原數(shù)組。

- (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.基本數(shù)據(jù)類(lèi)型局部變量

test5 test6 演示了加了 __block 修飾的變量在外部修改了,那么 block 內(nèi)部也可見(jiàn),當(dāng)然,在 block 內(nèi)部修改了,外部也可見(jiàn)。

- (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的基本數(shù)據(jù)類(lèi)型局部變量

- (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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 《Objective-C高級(jí)編程》這本書(shū)就講了三個(gè)東西:自動(dòng)引用計(jì)數(shù)、block、GCD,偏向于從原理上對(duì)這些內(nèi)容...
    WeiHing閱讀 10,087評(píng)論 10 69
  • 1.1 局部變量 局部自動(dòng)變量,在Block中可被讀取。Block定義時(shí)copy變量的值,在Block中作為常量使...
    陳雨塵閱讀 3,038評(píng)論 4 31
  • 在介紹Block之前通過(guò)一個(gè)簡(jiǎn)單的應(yīng)用場(chǎng)景認(rèn)識(shí)下Block 場(chǎng)景描述如下:TableView上面有多個(gè)Custom...
    黑_白_灰閱讀 1,471評(píng)論 4 29
  • 重點(diǎn)掌握 3 類(lèi)對(duì)象和方法 對(duì)象就是一個(gè)物體 類(lèi)的獨(dú)特存在就是一個(gè)實(shí)例,對(duì)實(shí)例進(jìn)行操作叫做方法。方法可以應(yīng)用于類(lèi)或...
    Coder大雄閱讀 1,365評(píng)論 0 2
  • 哈測(cè)試
    欍人_閱讀 278評(píng)論 0 0

友情鏈接更多精彩內(nèi)容