Block存储区域
栈区:_NSConcreteStackBlock类对象,设置在栈上
堆区: 1,_NSConcreteMallocBlock类对象,设置在有malloc函数分配的堆中
2,Blocks提供了将Block和__block变量从栈上复制到堆上的方法,将栈上的Block复制到堆上,这样即使Block的作用域结束,堆上的Block还可以继续存在
数据区域: 1,_NSConcreteGlobalBlock类对象,与全局变量一样,设置在程序的数据区域中;在全局变量的地方使用block语法时,生成的block为_NSConcreteGlobalBlock类对象
2,使用全局变量的地方不能使用自动变量,所以不存在对自动变量进行截获。由此Block用结构体实例的内容不依赖于执行时的状态,所以整个程序中只需要一个实例。因此将Block用结构体实例设置在与全局变量相同的数据区域中即可
3,只要Block不截获自动变量,就可以将Block用结构体实例设置在程序的数据区域
总结: 1,全局变量的地方有Block语法
void(^block)(void) = ^ { NSLog(@"Global Block");};
int main() {
}
2,Block语法的表达式中不使用截获自动变量时
int main() {
int(^block)(int count) = ^(int count) {
return count;
};
block(2);
}