ios - block 内的静态变量

标签 ios objective-c macos cocoa objective-c-blocks

当我在这样的 block 内声明静态变量时会发生什么?

dispatch_async(dispatch_get_main_queue(), ^{
 static NSInteger myNumber;
 // do stuff with myNumber      
});
  1. 第二次触发此 block 时会发生什么?
  2. 如果 block 在运行后释放,myNumber 怎么会还在那里?
  3. 这样做可以吗?我的意思是这种做法会导致任何问题,例如由于无法释放而导致 block 泄漏吗?

最佳答案

block specification没有明确提及如何处理 block 内的静态变量,只是 block 体是一个复合语句,与函数体相同。因此,语义与函数中声明的静态变量相同,即它们是全局生命周期的变量,只能在声明的范围内通过名称直接访问。

每次计算 block 文字 (^{...}) 时都会构造一个 block 。该值包含一个指向 block 体编译代码的标准 C 函数指针,它与任何其他复合语句一样在编译时生成一次。

您的问题的答案如下:

  1. What happens the second time this block is triggered?

第二次执行具有本地static变量的函数时,会发生同样的情况,函数体会看到先前存储在变量中的值。

  1. How can myNumber be still there if the block will deallocate after running?

因为它是 block 值,其中包括任何关联的捕获变量,已被释放;包含任何静态变量的编译代码始终存在。

  1. Is doing this OK? I mean will this practice cause any problem, like the block leaking because it is unable to be released?

执行此操作与在函数内执行此操作相同。如果static是Objective-C对象类型,那么存储在其中的引用可能会“泄漏”——就像标准全局变量一样。除非您在 static 变量中存储对 block 本身的引用(直接或通过引用链间接),否则不会阻止 block 值被释放。

HTH

关于ios - block 内的静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46402330/

相关文章:

ios - 尝试从组中打开一个 UISwitch,并在 iOS 中同时禁用其他 UISwitch

iphone - 尝试定义 rightBarButtonItems 时应用程序崩溃

ios - viewWithTag 在 cellForRowAtIndexPath 方法中返回 nil

macos - 自定义 NSFormatter swift 返回 nil

php - 从 OS X 将视频直接上传到 YouTube

ios - 为什么 spotify 登录不起作用?

ios - 我可以快速制作一个文本有多种颜色的按钮吗?

ios - NSFetchedResultsController 不使用合并的上下文更新缓存

iphone - 网址连接 IOS 5

c++ - 在 MacOSX 上,使用 g++,std::vector .size() 线程安全吗?