亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

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

霍城县| 竹北市| 南华县| 乌兰察布市| 凌云县| 台中县| 桃园县| 凤冈县| 渝中区| 嘉峪关市| 南投县| 鲁山县| 阿拉善右旗| 河间市| 邯郸县| 元谋县| 微博| 五指山市| 蒙城县| 昌乐县| 都安| 岫岩| 阿合奇县| 海盐县| 金溪县| 永顺县| 屏东市| 盖州市| 丰镇市| 朝阳市| 穆棱市| 监利县| 南通市| 万荣县| 溧阳市| 锡林浩特市| 武功县| 青冈县| 洛南县| 文成县| 南部县|