块内部的静态变量
问题描述:
当我在这样的块内声明静态变量时会发生什么?块内部的静态变量
dispatch_async(dispatch_get_main_queue(), ^{
static NSInteger myNumber;
// do stuff with myNumber
});
- 会发生什么情况该块被触发,第二次?
- 如果块在运行后会释放,myNumber如何仍然存在?
- 正在做这件事吗?我的意思是这种做法是否会导致任何问题,比如块泄漏,因为它无法被释放?
答
block specification没有明确提及如何处理块中的static
变量,只是块体是一个复合语句,它与函数的主体完全相同。因此,语义是相同的,用于在功能声明static
变量,即它们是其是仅直接访问由名称它们在声明的范围内的全局寿命的变量。
A嵌段值构造各时间a 区块字面量(^{...}
)被评估。该值包含一个标准的C函数指针,指向块体的编译代码,这与编译时生成一次其他复合语句一样。
的回答您的问题,只是从这个如下:
- 会发生什么情况该块被触发,第二次?
出现这种情况,执行与本地static
变量的功能的第二时间
同样的事情,该函数体看到预先存储在变量中的值。
- 如果块在运行后会释放,myNumber如何仍然存在?
因为它是块值,其中包括任何相关的捕获变量,这是取消分配;包含任何static
变量的编译代码始终存在。
- 这样做没问题吗?我的意思是这种做法是否会导致任何问题,比如块泄漏,因为它无法被释放?
这样做和在一个函数中做同样的事情。如果static
是Objective-C对象类型,那么存储在其中的引用可能会“泄漏” - 就像标准全局变量一样。除非您在static
变量中存储对块本身的引用(直接或间接通过引用链),否则块值不会被取消分配。
HTH
答
也许我们可以回答使用 “C” 的基本逻辑.. closure->块 - >指针到std C函数,以 “C” 静态逻辑情况出现>全局(OMG!)
BRILLIANT!谢谢 – SpaceDog