Swift 5強制獨佔記憶體
Swift 5 將帶來改進的 Swift 程式記憶體安全性,在程式的其他部分修改變數時,不允許通過其他變數名來訪問這些變數。這個變更對現有應用程式的行為和 Swift 編譯器本身都有重要影響。
|
在多種情況下會發生獨佔記憶體訪問問題。編譯器可以靜態地捕獲大部分問題,剩下的只能在執行時處理。只能在執行時處理的問題包括具有轉義閉包、類型別屬性、靜態屬性和全域性變數的排他性違規。
為了更好地說明這個問題,我們可以考慮一個相當普遍的情況:修改一個函式的 inout 變數,這個函式執行了一個閉包,這個閉包使用同一作用域內的兩個不同的名稱訪問上述的變數:
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) { modifier(&value) modifier(&value) } func testCount() { var count = 1 modifyTwice(&count) { $0 += count } print(count) }
在這個例子中,因為使用 count 同時作為 modifyTwice 和 modifier 的 inout 引數,所以出現了問題。我們不清楚 print 語句應該列印出什麼內容。第一次 count 變數遞增,它的值遞增到 2。但是,當執行第二次加法時,要新增到 $0 的 count 值是多少?這可能取決於很多因素,因為記憶體操作不一定是瞬時的。更糟糕的是,編譯器可能會引入優化,進一步使這種情況複雜化。
這個問題不僅與通過不同變數名同時修改記憶體的不可預測性有關,也與編譯器的複雜性有關。
這可能會導致意外和混亂的結果。它還導致編譯器和標準庫的實現具有很大的保守性,它們通常必須確保程式的基本可靠性(沒有崩潰或未定義的行為),即使是在不尋常的情況下。
所有這些意味著如果發現獨佔訪問衝突,使用 Swift 5 編譯器編譯的應用程式將在執行時崩潰。這個行為以前在 Swift 4 編譯器除錯模式下可用,因此,僅在執行時模式下測試過的程式在使用 Swift 5 編譯時有崩潰的風險。
Swift 4 編譯器可用,因此僅在執行時模式下測試的程式在使用 Swift 5 編譯時可能會崩潰。
修復訪問獨佔違規的一般方法是複製資料。在我們的示例中,這將歸結為:
func modifyTwice(_ value: inout Int, by modifier: (inout Int) -> ()) { modifier(&value) modifier(&value) } func testCount() { var count = 1 let increment = count modifyTwice(&count) { $0 += increment } print(count) }
實際上,訪問獨佔違規檢查可能會被禁用,但強烈建議不要這樣做:
雖然禁用執行時檢查可能可以解決效能問題,但這並不意味著獨佔違規是安全的。如果沒有啟用強制執行,程式設計師必須遵守獨佔規則。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2636217/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Swift 5將強制執行記憶體獨佔訪問Swift記憶體
- influxdb記憶體佔用剖析UX記憶體
- 資源記憶體佔用記憶體
- [譯] Swift 中的記憶體洩漏Swift記憶體
- Swift 記憶體管理之 weak 與 unownedSwift記憶體
- Swift的ARC和記憶體洩漏Swift記憶體
- Java記憶體管理機制Java記憶體
- jvm記憶體管理機制JVM記憶體
- js記憶體回收機制JS記憶體
- javaScript 記憶體管理機制JavaScript記憶體
- mariadb 記憶體佔用優化記憶體優化
- python物件的記憶體佔用Python物件記憶體
- node計算記憶體佔用記憶體
- 託管堆記憶體佔用記憶體
- 如何檢視MySQL資料庫佔多大記憶體,佔用太多記憶體怎麼辦?MySql資料庫記憶體
- c語言強制記憶體轉化引發的問題C語言記憶體
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- jvm:記憶體模型、記憶體分配及GC垃圾回收機制JVM記憶體模型GC
- Swift列舉關聯值的記憶體探究Swift記憶體
- [譯] Swift:通過示例避免記憶體洩漏Swift記憶體
- 100*100的 canvas 佔多少記憶體?Canvas記憶體
- MySQL記憶體佔用計算公式MySql記憶體公式
- DOTNET記憶體佔用最佳化記憶體
- Java記憶體模型,垃圾回收機制,常用記憶體命令及工具Java記憶體模型
- Java的記憶體管理機制之記憶體區域劃分Java記憶體
- Swift記憶體賦值探索一: 理解物件在記憶體中的儲存狀態Swift記憶體賦值物件
- Win10記憶體佔用過多怎麼辦 win10清理記憶體佔用的方法Win10記憶體
- 電腦記憶體佔用過高怎麼辦 電腦記憶體佔用過高解決方法記憶體
- 5.虛擬記憶體記憶體
- 淺析java記憶體管理機制Java記憶體
- 關於JavaScript的記憶體機制JavaScript記憶體
- Java程式執行記憶體機制Java記憶體
- 記憶體管理機制的發展記憶體
- 【記憶體管理】頁面分配機制記憶體
- Redis 記憶體淘汰機制詳解Redis記憶體
- 檢視LINUX程式記憶體佔用情況Linux記憶體
- Windbg分析高記憶體佔用問題記憶體
- Redis的記憶體回收機制和記憶體過期淘汰策略詳解Redis記憶體