亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Swift在什么情況會(huì)發(fā)生內(nèi)存訪問(wèn)沖突詳解

 更新時(shí)間:2021年01月12日 16:11:12   作者:_GodIsCoder  
這篇文章主要給大家介紹了關(guān)于Swift在什么情況會(huì)發(fā)生內(nèi)存訪問(wèn)沖突的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

眾所周知,Swift 是一門類型安全的語(yǔ)言,它會(huì)通過(guò)編譯器報(bào)錯(cuò)來(lái)阻止你代碼中不安全的行為。比如變量必須在使用之前聲明、變量被銷毀之后內(nèi)存不能在訪問(wèn)、數(shù)組越界等問(wèn)題。

Swift 會(huì)通過(guò)對(duì)于修改同一塊內(nèi)存,同一時(shí)間以互斥訪問(wèn)權(quán)限的方式(同一時(shí)間,只能有一個(gè)寫權(quán)限),來(lái)確保你的代碼不會(huì)發(fā)生內(nèi)存訪問(wèn)沖突。雖然 Swift 是自動(dòng)管理內(nèi)存的,在大多數(shù)情況下你并不需要關(guān)心這個(gè)。但理解何種情況下會(huì)發(fā)生內(nèi)存訪問(wèn)沖突也是十分必要的。

首先,來(lái)看一下什么是內(nèi)存訪問(wèn)沖突。

內(nèi)存訪問(wèn)沖突

當(dāng)你設(shè)值或者讀取變量的值得時(shí)候,就會(huì)訪問(wèn)內(nèi)存。

var age = 10 // 寫權(quán)限
print(age) // 讀權(quán)限

當(dāng)我們對(duì)同一塊內(nèi)存,同時(shí)進(jìn)行讀寫操作時(shí),會(huì)產(chǎn)生不可預(yù)知的錯(cuò)誤。比如上面的 age,假如在你讀取它值的期間有別的代碼將它設(shè)為 20,那么你讀取到的有可能是 10,也有可能是 20。這就產(chǎn)生了問(wèn)題。

內(nèi)存訪問(wèn)沖突:對(duì)同一塊內(nèi)存,同時(shí)進(jìn)行讀寫操作,或者同時(shí)進(jìn)行多個(gè)寫入操作時(shí),就會(huì)造成內(nèi)存訪問(wèn)沖突。

了解了什么是內(nèi)存訪問(wèn)沖突,下面來(lái)看下什么情況下回造成內(nèi)存訪問(wèn)沖突。

In-Out 參數(shù)

當(dāng) In-Out 參數(shù)為全局變量,并且該變量在函數(shù)體內(nèi)被修改時(shí),就會(huì)造成內(nèi)存訪問(wèn)沖突。比如下面的代碼:

var age = 10

func increment(_ num: inout Int) { // step1
 num += age // step2
}
increment(&age)

increment(:) 在整個(gè)函數(shù)體內(nèi),對(duì)所有的 In-Out 參數(shù)都有寫權(quán)限。在上述代碼中,step1 已經(jīng)獲得了 age 的寫權(quán)限,而 step2 有得到了 age 的讀權(quán)限,這樣就造成了同一塊內(nèi)存,同時(shí)進(jìn)行了讀寫操作。從而造成了內(nèi)存訪問(wèn)沖突。

上面的問(wèn)題可以通過(guò)將 age 拷貝一份來(lái)解決:

// step1
var copyOfAge = age
increment(&copyOfAge)
age = copyOfAge

step1 將 age 的值拷貝到另一塊內(nèi)存上,這樣在函數(shù)體內(nèi)就是存在對(duì) age 的讀權(quán)限和對(duì) copyOfAge 的寫權(quán)限,因?yàn)?age 和 copyOfAge 是兩塊內(nèi)存,所以就不會(huì)造成內(nèi)存訪問(wèn)沖突。

結(jié)構(gòu)體的 mutating 函數(shù)

對(duì)于結(jié)構(gòu)體的 mutating 函數(shù)來(lái)說(shuō),它整個(gè)函數(shù)體都有 self 的寫權(quán)限。

struct Person {
 var age: Int
 mutating func increment(_ num: inout Int) { 
  age += num 
 }
}

var p1 = Person(age: 10)
p1.increment(&p1.age)

上述的代碼編譯器會(huì)報(bào)錯(cuò):Overlapping accesses to 'p1', but modification requires exclusive access; consider copying to a local variable。很明顯這是一個(gè)內(nèi)存訪問(wèn)沖突。

In-Out 參數(shù)獲得了 p1 的寫權(quán)限;mutating 函數(shù)也獲得了 p1 的寫權(quán)限。同一塊內(nèi)存,同時(shí)有兩個(gè)寫操作。造成內(nèi)存訪問(wèn)沖突??梢酝ㄟ^(guò)同上的拷貝操作來(lái)解決。

值類型的屬性

對(duì)于結(jié)構(gòu)體、枚舉、元祖等值類型來(lái)說(shuō),修改它們的屬性就相當(dāng)于修改它們整個(gè)的值。比如下面的代碼:

func increment(_ num1: inout Int, _ num2: inout Int) {
 print(num1 + num2)
}

var tuple = (age: 10, height: 20)
increment(&tuple.age, &tuple.height)

&tuple.age 拿到了 tuple 的寫權(quán)限,&tuple.height 又拿了 tuple 的寫權(quán)限。同一塊內(nèi)存,同時(shí)有兩個(gè)寫操作。造成內(nèi)存訪問(wèn)沖突。

這個(gè)問(wèn)題可以通過(guò)局部變量來(lái)解決:

func someFunction() {
 var tuple = (age: 10, height: 20)
 increment(&tuple.age, &tuple.height)
}

因?yàn)樵?someFunction() 函數(shù)里,age 和 height 沒(méi)有產(chǎn)生任何的交互(沒(méi)有在其期間去讀取或者寫入 age 和 height),所以編譯器可以保證內(nèi)存安全。

PS:關(guān)于評(píng)論區(qū)的問(wèn)題,在 someFunction() 函數(shù)里沒(méi)有任何交互是什么意思?

答:在someFunction() 里,編譯器可以保證沒(méi)有別的線程來(lái)讀取或者修改 tuple。因此,可以保證內(nèi)存安全。而對(duì)于全局變量,編譯器無(wú)法保證是否有別的線程在讀取或者修改。

下面的代碼就是在函數(shù)體內(nèi)有交互的代碼,雖然是局部變量,但涉及多個(gè)線程修改 tuple 的值,因此會(huì)造成內(nèi)存訪問(wèn)沖突:

func someFunction() {
 var tuple = (age: 10, height: 20)
 
 DispatchQueue.main.async {
  tuple.age += 10
 }
 
 DispatchQueue.main.async {
  increment(&tuple.age, &tuple.height)
 }
}

總結(jié)

對(duì)同一塊內(nèi)存,同時(shí)進(jìn)行讀寫操作,或者同時(shí)進(jìn)行多個(gè)寫入操作時(shí),就會(huì)造成內(nèi)存訪問(wèn)沖突。

會(huì)造成內(nèi)存訪問(wèn)沖突的情況:

  • In-Out 為全局參數(shù),并且在函數(shù)體內(nèi)修改了它。
  • 結(jié)構(gòu)體的 mutating 函數(shù)內(nèi)修改結(jié)構(gòu)體的值。
  • 同一值類型的多個(gè)屬性當(dāng)做函數(shù)的 In-Out 參數(shù)。

到此這篇關(guān)于Swift在什么情況會(huì)發(fā)生內(nèi)存訪問(wèn)沖突的文章就介紹到這了,更多相關(guān)Swift內(nèi)存訪問(wèn)沖突內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)

    這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之下標(biāo)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用swift具有一定的參考價(jià)值,需要的朋友下面來(lái)一起看看吧。
    2017-03-03
  • R.swift的使用與安裝教程

    R.swift的使用與安裝教程

    這篇文章主要給大家介紹了關(guān)于R.swift使用與安裝的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    這篇文章主要為大家介紹了Swift動(dòng)態(tài)更換app圖標(biāo)AppIcon的簡(jiǎn)單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI圖片縮放、拼圖等處理教程

    SwiftUI是一種使用Swift語(yǔ)言在蘋果設(shè)備上構(gòu)建用戶界面的創(chuàng)新且簡(jiǎn)單的方式,下面這篇文章主要給大家介紹了關(guān)于SwiftUI圖片縮放、拼圖等處理的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • Swift教程之繼承詳解

    Swift教程之繼承詳解

    這篇文章主要介紹了Swift教程之繼承詳解,一個(gè)類可以從另外一個(gè)類中繼承方法,屬性或者其它的一些特性,當(dāng)一個(gè)類繼承于另外一個(gè)類時(shí),這個(gè)繼承的類叫子類,被繼承的類叫父類,需要的朋友可以參考下
    2015-01-01
  • Swift中字典與JSON轉(zhuǎn)換的方法

    Swift中字典與JSON轉(zhuǎn)換的方法

    Swift中經(jīng)常會(huì)遇到字典和字符串的相互轉(zhuǎn)換,本篇文章主要介紹了Swift中字典與JSON轉(zhuǎn)換的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 解析Swift語(yǔ)言面相對(duì)象編程中的繼承特性

    解析Swift語(yǔ)言面相對(duì)象編程中的繼承特性

    這篇文章主要介紹了解析Swift語(yǔ)言面相對(duì)象編程中的繼承特性,是Swift入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • Swift UILable 設(shè)置內(nèi)邊距實(shí)例代碼

    Swift UILable 設(shè)置內(nèi)邊距實(shí)例代碼

    本文主要介紹Swift UILable 設(shè)置內(nèi)邊距,這里提供示例代碼供大家參考,有需要的小伙伴可以看下
    2016-07-07
  • Swift初始化方法的使用介紹

    Swift初始化方法的使用介紹

    Swift有著超級(jí)嚴(yán)格的初始化方法,不僅強(qiáng)化了designated初始化方法的地位,所有不加修飾的init方法都需要在方法中確保非Optional的實(shí)例變量被賦值初始化,下面這篇文章主要給大家介紹了關(guān)于Swift中初始化init的相關(guān)資料,需要的朋友可以參考下。
    2022-08-08
  • SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動(dòng)畫

    SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動(dòng)畫

    這篇文章主要介紹了SwiftUI使用Paths和AnimatableData實(shí)現(xiàn)酷炫的顏色切換動(dòng)畫,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-05-05

最新評(píng)論