Swift中Singleton的實現

2022-10-10 12:54:13 字數 1297 閱讀 1856

保證乙個類公有乙個例項,並提供乙個訪問它的全域性訪問點。

1、使用場景

2、實現的重要三個步驟

swift語言不支援變數及方法的許可權,沒有辦法隱藏變數及方法,可以隨意直接建立乙個例項。單例的建立有很多寫法,swift支援只有struct支援靜態變數,class不支援靜態變數,所以很容易想到,在類的內部使用struct就能解決引用的儲存問題,**如下:

class swiftsingleton 

return inner.instance!

}struct inner

}

執行如下測試**,進行簡單測試: 

class swiftsingletontest: xctestcase 

}

執行結果,左側綠色對號代表執行通過: 

其中===在swift中代表「等價於」,比較的是兩個變數或者常量的引用位址,只能用於class的比較

在swift中static型別變數會自動實現成延遲載入模式,也可以更簡單的實現成如下:

class swiftsingleton 

struct inner

}

在所有語言中單例分為懶漢模式(延遲載入),餓漢模式,一般為了避免資源浪費,都喜歡實現成懶漢模式,即使用時在生成例項。在swift語言中,由於static關鍵字做了優化,自動實現了 延遲載入模式,所以上面的**實現的是懶漢模式而並非餓漢模式 

class與struct乙個非常重要的區別:

class:傳引用 

struct:傳值 

有部分人可能想通過struct來直接實現單例模式,由於struct傳遞時是傳的值,會造成記憶體中有多個拷貝,測試如下:

struct swiftsingleton 

var single1 = swiftsingleton.shared

var single2 = swiftsingleton.shared

single2.name = "2"

println("------->\(single1.name)")

println("------->\(single2.name)")

列印結果如下: 

------->1

------->2

program ended with exit code: 0

從上面可以看到,通過struct下的實現,我們保證有且僅有乙個例項,這種實現方式是錯誤的

singleton中的陷阱

單件模式應該是設計模式中運用得最多的模式之一,對於全域性性的復用性的物件我們通常會採用單件模式,正是因為單件這種頻繁運用的看似簡單的模式前段時間在我們的專案中卻引發了乙個致命性的崩潰bug,因此在這裡總結一下,希望能給大家有所幫助。所謂單件模式就是在整個程序執行期間只需要例項化一次為所有執行執行緒公...

boost中singleton的實現

在工作中遇到不少情況使用singleton模式,下面採用的是最簡單的一種形式 1class foo2910 private 11 foo 12 這種實現,在單執行緒情況下,簡單而有效。對於執行緒安全的singleton的實現,網上有不少討論。這兩天看到boost庫中的一種實現,沒有使用鎖機制,而是充...

C 中的 Singleton 實現

ansi c 中的 singleton 實現說難不難,說容易也不容易,很多人寫 ansi c 的 singleton class 都有錯誤。這篇文章討論怎樣在 ansi c 中寫 singleton class,希望對大家有幫助。設計模式 中把 singleton 寫成返回指標 class sing...