91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swift5強制獨占內存怎么辦

發布時間:2021-12-29 14:47:04 來源:億速云 閱讀:194 作者:iii 欄目:開發技術

本篇內容介紹了“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強制獨占內存怎么辦”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

龙州县| 神池县| 大竹县| 三门县| 东莞市| 岳阳市| 诏安县| 廊坊市| 吉林省| 吉木乃县| 繁昌县| 手机| 微博| 淅川县| 清水河县| 上蔡县| 彭阳县| 梓潼县| 东乡族自治县| 乐山市| 鲁甸县| 博客| 嫩江县| 灵山县| 汨罗市| 筠连县| 伊吾县| 神木县| 突泉县| 屯门区| 宕昌县| 友谊县| 永平县| 宜宾县| 吉安县| 乌兰县| 临桂县| 湘潭县| 安康市| 夏河县| 银川市|