代码之家  ›  专栏  ›  技术社区  ›  Duck

块内静态变量

  •  2
  • Duck  · 技术社区  · 7 年前

    dispatch_async(dispatch_get_main_queue(), ^{
     static NSInteger myNumber;
     // do stuff with myNumber      
    });
    
    1. 第二次触发此块时会发生什么?
    2. 如果块在运行后将解除分配,myNumber怎么可能仍然存在?
    2 回复  |  直到 7 年前
        1
  •  4
  •   CRD    7 年前

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

    每次 块文字 ^{...} )进行评估。该值包含一个标准C函数指针,指向块体的编译代码,与任何其他复合语句一样,它在编译时生成一次。

    您的问题答案如下:

    静止的

    1. 如果块在运行后将解除分配,myNumber怎么可能仍然存在?

    因为它是块值,包括任何相关的捕获变量,被释放;编译后的代码,其中包括任何 静止的

    1. 这样做可以吗?我的意思是,这种做法会不会导致任何问题,比如因为无法释放而导致堵塞泄漏?

    这与在函数中执行相同。如果 是Objective-C对象类型,则存储在其中的引用可能会“泄漏”——就像标准全局变量一样。除非将对块本身的引用(直接或间接通过引用链)存储在 静止的 变量

    HTH公司

        2
  •  0
  •   ingconti    7 年前

    也许我们可以用“C”底层逻辑来回答。。关闭->块->指向std C函数的指针,指向“C”静态逻辑->全球(OMG!)