08.03-block的类型

1. block的类型

1. 全局block

在data区
没有访问变量
进行了copy操作,依然是__NSGlobalBlock__

		int age = 10;
        //globalBlock
        void (^globalBlock)(void) = ^{
            NSLog(@"------");
        };
        NSLog(@"globalBlock -- %@",globalBlock);
        //ARC :<__NSGlobalBlock__: 0x100004040>
        //MRC : <__NSGlobalBlock__: 0x100004038>
        globalBlock();
  • 如果使用了全局变量,也是__NSGlobalBlock__
//stackBlock
        void (^stackBlock)(void) = ^{
            NSLog(@"------%d",globalvari);
        };
        NSLog(@"stackBlock -- %@",stackBlock);
        //ARC : <__NSGlobalBlock__: 0x100004038>
        //MRC : <__NSGlobalBlock__: 0x100004030>
        stackBlock();
        
        //mallocBlock
        void (^mallocBlock)(void) = [^{
            NSLog(@"------%d",globalvari);
        } copy];
        NSLog(@"mallocBlock -- %@",mallocBlock);
        //ARC :<__NSGlobalBlock__: 0x100004058>
        //MRC : <__NSGlobalBlock__: 0x100004050>
        mallocBlock();

2. 栈block

在栈区
访问了局部变量
ARC下是__NSMallocBlock__ : ARC下自动进行了copy操作
MRC下才是__NSStackBlock__
进行copy操作,从栈区赋值到堆区

void (^stackBlock)(void) = ^{
	NSLog(@"------%d",age);
};
	NSLog(@"stackBlock -- %@",stackBlock);
//ARC : <__NSMallocBlock__: 0x101066810>
//MRC : <__NSStackBlock__: 0x7ff7bfeff2b0>
	stackBlock();

3. 堆block

NSStackBlock 调用了copy
进行copy操作,引用计数+1

void (^mallocBlock)(void) = [^{
            NSLog(@"------%d",age);
        } copy];
        NSLog(@"mallocBlock -- %@",mallocBlock);
        //ARC :<__NSMallocBlock__: 0x101066810>
        //MRC : <__NSMallocBlock__: 0x101105500>
        mallocBlock();

2. 总结

MRC环境下

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值