2014-07-12 32 views
5

我的Swift全局變量沒有被初始化。Swift快速刪除全局變量的初始化

class Person { 
    let name: String 
    init(name: String) { 
    self.name = name 
    println("\(name) is being initialized") 
    } 
    deinit { 
    println("\(name) is being deinitialized") 
    } 
} 

func local() { 
    let person = Person(name: "Local") 
} 

local() 

var personp: Person? = Person(name: "Optional Global") 
personp = nil 

var person = Person(name: "Global") 

我運行這在一個獨立的二進制文件(因爲apparently the playground has issues with deinit)禁用優化,使用Xcode6-β3:

> xcrun swift -O0 arc.swift && ./arc 
Local is being initialized 
Local is being deinitialized 
Optional Global is being initialized 
Optional Global is being deinitialized 
Global is being initialized 

注意失蹤全球正在deinitialized

我甚至無法弄清楚這是否是預期的行爲或錯誤,所以如果是前者,那麼可以參考相關法律文獻。

+0

爲什麼全局會被重新啓動?這是一個財產有效不是嗎? – Woodstock

+0

目前的答案都提到這並不是完全意料之外的,因爲它的底層實現。正如我在問題中所說的那樣,如果是這樣的話,那麼我希望得到更明確的引用。這是一個問題,原因是全局可能會跟蹤某種資源(文件,數據庫連接等),並且考慮到當前的行爲,程序員有責任確保不存在這樣的「資源所有者」作爲全球。 – Manav

回答

4

它看起來好像沒什麼問題......在結束應用程序沒有被釋放 - 沒有一點


DEINIT只是爲了釋放內存和刪除觀察員和東西 - 儘管在該過程結束這是有點 '無用' 作爲處理存儲器 '將被抹去' 反正

==>

SO:

從來沒有把任何東西,但內存管理/觀測相關的東西在DEINIT

如果你需要一個專門的停車方法 - 寫一個和退出過程

+0

我同意 - 我們認爲,如果我們依賴被調用的deinit,我們不應該將任何「資源所有者」保留爲全局對象。儘管我很期待引用:),因爲這在所有語言中都不一定是這種情況。例如,C++(看起來對Swift的影響之一)確實爲全局對象調用析構函數。 – Manav

4

想想代碼的最後行之前顯式調用它:

var personp: Person? = Person(name: "Optional Global") 
personp = nil 

var person = Person(name: "Global") 

exit(0) 

由於person從不設置爲另一個值,ARC從不減少退出前的保留計數。

夫特就像在執行一個C程序簡單地結束然後分配給進程所有存儲器在一個掃描被返回。

這與執行內存處理有很大不同,後者依賴進程內事件釋放內存。由於程序的所有執行完全停止,所以沒有線程運行deinit

因此,總而言之,這是應該的。

+0

由於Swift應該是非常安全的,因此可以合理地期望它在(定期)終止之前運行deinitializers。 (當然,如果你殺了-9,什麼都不能做。) – Raphael