block-arc与mrc下的存储区域

block存储区总结:

1 未任何引用外部变量,不管是arc或mrc,都是在global区;

2 如果引用了外部变量,在mrc下,在栈区;在arc下,block自动会copy到堆区;

一 ARC:

NSGlobalBlock:全局block,未访问任何外部变量;

NSMallocBlock: 访问了外部变量,堆 block,当引用计数为 0 时会被销毁;

NSStackBlock:栈block,直接打印block代码实现得到;

例:

        int i = 10;
        void (^block2)(void) = ^{
            NSLog(@"%d", i);
        };
        block2();
        NSLog(@"1%@", block2);
        NSLog(@"2%@",  ^{
            NSLog(@"%d", i);
        });

输出:

1 NSMallocBlock

2 NSStackBlock

说明:block2引用了外部变量,block2变量的地址在堆中(拷贝),block2的代码实现在栈中(原本);

 

二 MRC:

NSGlobalBlock:全局区,未引用任何外部变量;

NSStackBlock:栈区,引用了外部变量;(ARC下,NSStackBlock会被拷贝到堆区,NSMallocBlock)

NSMallocBlock:堆区,copy后;

例:

        NSMutableString *str = @"hello".mutableCopy;
        void (^block)(void) = ^{
            NSLog(@"%@", str);
        };
        block();
        NSLog(@"1%@", block);
        NSLog(@"2%@", Block_copy(block));

输出

1 NSStackBlock

2 NSMallocBlock

说明:MRC下,copy方法把栈区block拷贝到堆区;

附:arc的设置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值