您好,登錄后才能下訂單哦!
本篇內容介紹了“Swift5強制獨占內存怎么辦”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
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) }
實際上,訪問獨占違規檢查可能會被禁用,但強烈建議不要這樣做:
雖然禁用運行時檢查可能可以解決性能問題,但這并不意味著獨占違規是安全的。如果沒有啟用強制執行,程序員必須遵守獨占規則。
“Swift5強制獨占內存怎么辦”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。