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);
}

参考资料:

1,Block内存管理实例分析 2,谈Objective-C block的实现

results matching ""

    No results matching ""