Block可能存在内存的哪里

Block 在 Objective-C 中可能存在以下三个地方:

  1. 全局Block(Global Block)在数据段(Data Segment)中。全局Block是指不捕获任何外部变量的Block,它的内部没有引用任何栈上的变量。由于全局Block不依赖于任何特定的上下文,因此它们被编译为只读数据,并存储在数据段中。这意味着全局Block的内存分配是在编译时完成的,并且在程序运行期间保持不变。例如:

    void(^globalBlock)(void) = ^{
        NSLog(@"This is a global block.");
    };
    
  2. 栈区:如果 Block 捕获了外部的局部变量,并且这个 Block 没有被拷贝到堆区,那么这个 Block 就存储在栈区。例如:

    void stackBlockExample() {
        int a = 10;
        void(^stackBlock)(void) = ^{
            NSLog(@"a = %d", a);
        };
    }
    

    在这个例子中,stackBlock 捕获了外部的局部变量 a,并且这个 Block 没有被拷贝到堆区,所以 stackBlock 存储在栈区。

  3. 堆区:如果 Block 被拷贝到了堆区(例如使用 copy 方法,或者作为方法的返回值返回),那么这个 Block 就存储在堆区。例如:

    void(^heapBlockExample(void)) {
        int a = 10;
        return ^{
            NSLog(@"a = %d", a);
        };
    }
    

    在这个例子中,Block 作为方法的返回值返回,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值