2017-09-25 70 views
1

當我在這樣的塊內聲明靜態變量時會發生什麼?塊內部的靜態變量

dispatch_async(dispatch_get_main_queue(), ^{ 
static NSInteger myNumber; 
// do stuff with myNumber  
}); 
  1. 會發生什麼情況該塊被觸發,第二次?
  2. 如果塊在運行後會釋放,myNumber如何仍然存在?
  3. 正在做這件事嗎?我的意思是這種做法是否會導致任何問題,比如塊泄漏,因爲它無法被釋放?

回答

2

block specification沒有明確提及如何處理塊中的static變量,只是塊體是一個複合語句,它與函數的主體完全相同。因此,語義是相同的,用於在功能聲明static變量,即它們是其是僅直接訪問由名稱它們在聲明的範圍內的全局壽命的變量。

A嵌段構造各時間a 區塊字面量^{...})被評估。該值包含一個標準的C函數指針,指向塊體的編譯代碼,這與編譯時生成一次其他複合語句一樣。

的回答您的問題,只是從這個如下:

  1. 會發生什麼情況該塊被觸發,第二次?
  2. 出現這種情況,執行與本地 static變量的功能的第二時間

同樣的事情,該函數體看到預先存儲在變量中的值。

  1. 如果塊在運行後會釋放,myNumber如何仍然存在?

因爲它是塊值,其中包括任何相關的捕獲變量,這是取消分配;包含任何static變量的編譯代碼始終存在。

  1. 這樣做沒問題嗎?我的意思是這種做法是否會導致任何問題,比如塊泄漏,因爲它無法被釋放?

這樣做和在一個函數中做同樣的事情。如果static是Objective-C對象類型,那麼存儲在其中的引用可能會「泄漏」 - 就像標準全局變量一樣。除非您在static變量中存儲對塊本身的引用(直接或間接通過引用鏈),否則塊值不會被取消分配。

HTH

+1

BRILLIANT!謝謝 – SpaceDog

0

也許我們可以回答使用 「C」 的基本邏輯.. closure->塊 - >指針到std C函數,以 「C」 靜態邏輯情況出現>全局(OMG!)