block分类

前言

介绍下block分类

全局block

代码

- (void)test {
    
    
    void(^yang1)(void) = ^ {
    
     };
    yang1();
    NSLog(@"%@",[yang1 class]);
}

输出

2021-11-24 19:31:24.613795+0800 09_分类[42172:32561212] __NSGlobalBlock__

堆block

代码 ARC

- (void)test2 {
    
    
    int age = 30;
    // ARC特性  默认关键字__strong修饰变量   
    void(^yang2)(void) = ^ {
    
    
        NSLog(@"%d",age);
    };
    yang2();
    NSLog(@"%@",[yang2 class]);
}

代码 MRC

- (void)test2 {
    
    
    int age = 30;
    void(^yang2)(void) = [^ {
    
    
        NSLog(@"%d",age);
    } copy];
    yang2();
    NSLog(@"%@",[yang2 class]);
}

输出

2021-11-24 19:33:04.207321+0800 09_分类[42669:32565369] 30
2021-11-24 19:33:04.207464+0800 09_分类[42669:32565369] __NSMallocBlock__

栈block

代码 ARC

- (void)test3 {
    
    
    int age = 30;
    void(^__weak yang3)(void) = ^ {
    
    
        NSLog(@"%d",age);
    };
    yang3();
}

代码 MRC

- (void)test3 {
    
    
    int age = 30;
    void(^yang3)(void) = ^ {
    
    
        NSLog(@"%d",age);
    };
    yang3();
}

输出

2021-11-24 19:33:56.280433+0800 09_分类[42919:32567477] 30
2021-11-24 19:33:56.280616+0800 09_分类[42919:32567477] __NSStackBlock__

区别

用一张网图介绍下分类
请添加图片描述

总结

没有修饰符的局部变量默认的修饰符为auto,auto类型的局部变量的生命周期为离其最近的大括号内,超出该大括号,该变量被自动销毁

  • ARC下变量默认__strong修饰
  • ARC下Block创建完成后会被立即拷贝到堆区
  • 没有访问auto变量的block就是Global类型
  • 生成Block以后,如果这个Block不是全局Block,那么它就是为_NSConcreteStackBlock对象,但是如果其所属的变量作用域名结束,该block就被废弃,在栈上的__block变量也是如此
  • 栈block执行copy 就变成了 堆block
  • 如果Block和__block变量复制到了堆上以后,则不再会受到变量作用域结束的影响,因为它变成了堆Block

Guess you like

Origin blog.csdn.net/u014641631/article/details/121522727