Block 在 Objective-C 中可能存在以下三个地方:
-
全局Block(Global Block)在数据段(Data Segment)中。全局Block是指不捕获任何外部变量的Block,它的内部没有引用任何栈上的变量。由于全局Block不依赖于任何特定的上下文,因此它们被编译为只读数据,并存储在数据段中。这意味着全局Block的内存分配是在编译时完成的,并且在程序运行期间保持不变。例如:
void(^globalBlock)(void) = ^{ NSLog(@"This is a global block."); };
-
栈区:如果 Block 捕获了外部的局部变量,并且这个 Block 没有被拷贝到堆区,那么这个 Block 就存储在栈区。例如:
void stackBlockExample() { int a = 10; void(^stackBlock)(void) = ^{ NSLog(@"a = %d", a); }; }
在这个例子中,
stackBlock
捕获了外部的局部变量a
,并且这个 Block 没有被拷贝到堆区,所以stackBlock
存储在栈区。 -
堆区:如果 Block 被拷贝到了堆区(例如使用
copy
方法,或者作为方法的返回值返回),那么这个 Block 就存储在堆区。例如:void(^heapBlockExample(void)) { int a = 10; return ^{ NSLog(@"a = %d", a); }; }
在这个例子中,Block 作为方法的返回值返回,