2015-10-16 49 views
7

Swift中的靜態變量是如何存儲的?在Swift中,靜態變量是如何存儲在內存中的?

  1. 如果我從不調用func useStaticVar(),會發生什麼?這些變量是否初始化?

  2. 如果我調用useStaticVar()然後再也不訪問它們會發生什麼?氬

    struct Something { 
        static var myVariable = 0 
        static let myConstant = 3 
        static var myString: String? 
    
        static func useStaticVar() { 
         myVariable = myConstant 
         myString = String(myVariable) 
        } 
    } 
    

回答

1
static var myVariable = 0 
static let myConstant = 3 

被初始化。 myString在func useStaticVar中被初始化。如果你不叫它,它將保持nil,因爲它是可選的。 static方法不能被overrided。 一些有趣的信息是here

+0

什麼時候它是initalized?程序運行時? didFinishLaunchingWithOptions之前?在這之後? – Esqarrouth

0

檢查: Type Properties

注意

與存儲實例屬性,你必須給存儲 類型屬性的默認值。這是因爲類型本身沒有 初始值設定項,它可以在 初始化時間將值分配給存儲的類型屬性。

存儲類型屬性在其第一次訪問時被懶惰地初始化。 它們保證只初始化一次,即使同時通過多個線程訪問 ,並且它們不需要使用惰性修飾符標記爲 。

您必須始終將存儲類型屬性設置爲默認值。

您的代碼缺少默認值myString,在這種情況下,斯威夫特給它一個默認nil

存儲類型屬性在其第一次訪問時被懶惰地初始化。

您可以測試和查看存儲類型的屬性是如何與一些像這樣的代碼initilized:

func ZeroGenerator() -> Int { 
    print(#function) 
    return 0 
} 

func ThreeGenerator() -> Int { 
    print(#function) 
    return 3 
} 

func NilGeneartor() -> String? { 
    print(#function) 
    return nil 
} 

struct Something { 
    static var myVariable = ZeroGenerator() 
    static let myConstant = ThreeGenerator() 
    static var myString: String? = NilGeneartor() 

    static func useStaticVar() { 
     print(#function) 
     myVariable = myConstant 
     myString = String(myVariable) 
    } 
} 

Something.useStaticVar() 

輸出:

useStaticVar() 
ZeroGenerator() 
ThreeGenerator() 
NilGeneartor() 

編譯器可以使恆定的默認值一些優化,但語義上沒有區別。

相關問題