Block存放区域的类型

29 篇文章 0 订阅
看到有个面试题上问block的类型,本来以为是以参数和返回值来分类,看到答案是以存放区域来分类的,特地研究了一下

    int a = 10;

    void(^ blockA)(void) = ^{
        NSLog(@"just a blockA");
    };
    NSLog(@"blockA:%@",blockA);
    
    void(^ blockB)(void) = ^{
        NSLog(@"just a block%d",a);
    };
    NSLog(@"blockB:%@",blockB);
    
    void(^ __weak blockC)(void) = ^{
        NSLog(@"just a block%d",a);
    };
    NSLog(@"blockC:%@",blockC);


ARC下打印结果:
blockA:<__NSGlobalBlock__: 0x109108110>
blockB:<__NSMallocBlock__: 0x600000258c00>
blockC:<__NSStackBlock__: 0x7ffee6af6b88>

当block中未引用变量时(如blockA),会被存放在全局区,这样当其方法return时,block也不会释放。
当block引用变量时(如blockB),ARC状态下会被存放在堆区(MRC状态下会存放在栈区)
当block引用变量且用__weak修饰时,会被存放在栈区

我不知道这个结果有什么用,越来越发现现在的面试就像问你茴字的四种写法一样,有没有用不知道,关键在于考察你是否属于一类人吧。去他妈的,关键一点要记住就是 block属性要用copy修饰,不然赋值之后使用会导致崩溃
对block执行copy操作会有这三种情况:
在全局的block调用copy什么也不做
在栈上的block调用copy会复制到堆上
在堆上的block调用copy 引用计数增加
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值