iOS - Block的類型

1. 三種類型

Block有以下三種類型markdown

  • NSConcrateGlobalBlock 全局
  • NSConcrateStackBlock 棧
  • NSConcrateMallocBlock 堆

1. NSConcrateGlobalBlock 位於全局區

當咱們聲明一個Block,若是這個block沒有捕獲外部變量,那麼這個Block就位於全局區,此時對NSGlobal的retain、copy、release都是無效的,ARC、MRC都是如此函數

- (void)blockType {
    void(^block1)(void) = ^{
    };
    NSLog(@"-- block1 = %@", [block1 class]);
}
複製代碼
2021-05-17 17:36:02.791048+0800 MemoryManageDemo[37503:5056528] -- block1 = __NSGlobalBlock__
複製代碼

2. NSConcrateStatckBlock 棧區

block捕獲了外部變量,可是沒有強引用這個block,直接打印出來spa

//NSConcrateStackBlock
    int a = 10;
    NSLog(@"-- block2 = %@",[^{
        NSLog(@"-- a = %@",a);
    } class]);

複製代碼
2021-05-17 18:35:27.662072+0800 MemoryManageDemo[57159:5148084] -- block2 = __NSStackBlock__
複製代碼

3. NSConcrateMallocBlock 堆區

ARC環境下只有捕獲了外部變量,而且有強引用指向該Block(或作爲函數返回值),系統就會自動將NSStackBlock copy到堆上,就是NSConcrateMallocBlockcode

//NSConcrateMallocBlock
    int b = 10;
    void(^block3)(void) = ^{
        NSLog(@"-- b = %d", b);
    };
    NSLog(@"-- block3 = %@", [block3 class]);
複製代碼
2021-05-17 18:37:36.525794+0800 MemoryManageDemo[57425:5151753] -- block3 = __NSMallocBlock__
複製代碼
相關文章
相關標籤/搜索