一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Swift - 詳談swift內(nèi)存管理中的引用計(jì)數(shù)

詳談swift內(nèi)存管理中的引用計(jì)數(shù)

2021-01-06 15:20冬日降臨 Swift

下面小編就為大家?guī)?lái)一篇詳談swift內(nèi)存管理中的引用計(jì)數(shù)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧

swift中,每一個(gè)對(duì)象都有生命周期,當(dāng)生命周期結(jié)束會(huì)調(diào)用deinit()函數(shù)進(jìn)行釋放內(nèi)存空間。

觀察這一段代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Person{
 
 var name: String
 var pet: Pet?
 
 init(name: String){
  self.name = name
  print("Person", name, "is initialized")
 }
 
 init(name: String, petName: String){
  self.name = name
  self.pet = Pet(name: petName)
  print("Person", name, "is initialized")
 }
 
 deinit{
  print("Person", name, "is deinitialized!")
 }
}
 
class Pet{
 
 var name: String
 init(name: String){
  self.name = name;
  print("Pet", name, "is initialized")
 }
 
 deinit{
  print("Pet", name, "is deinitialized!")
 }
}

這段代碼創(chuàng)建了兩個(gè)類,分別是Person類和Pet類,每個(gè)類中都有init方法進(jìn)行創(chuàng)建對(duì)象和deinit方法來(lái)釋放內(nèi)存空間,其中Person類中有兩個(gè)init方法,分別對(duì)應(yīng)著是否包含Pet類的名稱。

當(dāng)我們調(diào)用這兩個(gè)方法:

?
1
2
var snow: Person? = Person(name: "snow", petName: "wolf")
snow = nil

兩步的執(zhí)行結(jié)果是:

?
1
2
3
4
Pet wolf is initialized
Person snow is initialized
Person snow is deinitialized!
Pet wolf is deinitialized!

會(huì)發(fā)現(xiàn)在創(chuàng)建snow這個(gè)對(duì)象的時(shí)候調(diào)用的是第二個(gè)init方法,在這個(gè)方法中會(huì)創(chuàng)建一個(gè)新的Pet對(duì)象,因此會(huì)首先打印出Pet wolf is initialized然后是Person snow is initialized。當(dāng)對(duì)snow對(duì)象進(jìn)行內(nèi)存釋放的時(shí)候,將nil賦給這個(gè)對(duì)象,那么會(huì)釋放snow這個(gè)內(nèi)存空間,同時(shí)也會(huì)釋放wolf這個(gè)內(nèi)存空間。

但是如果我們調(diào)用第一種init方法的時(shí)候我們會(huì)發(fā)現(xiàn):

?
1
2
3
4
5
6
7
var snow: Person? = Person(name: "snow")
 
var wolf: Pet? = Pet(name: "wolf")
snow?.pet = wolf
 
snow = nil
wolf = nil

我們首先創(chuàng)建了一個(gè)snow對(duì)象,之后又創(chuàng)建了一個(gè)wolf對(duì)象,然后將wolf添加到snow對(duì)象中去,但是當(dāng)我們對(duì)這snow這個(gè)對(duì)象進(jìn)行內(nèi)存釋放的時(shí)候會(huì)發(fā)現(xiàn):

?
1
2
3
Person snow is initialized
Pet wolf is initialized
Person snow is deinitialized!

僅僅只有snow的內(nèi)存空間被釋放了,但是wolf的內(nèi)存空間并沒有被釋放,這里就和swift內(nèi)存管理中的引用計(jì)數(shù)有關(guān)了:

當(dāng)我們創(chuàng)建了snow這個(gè)對(duì)象之后,我們就為它開辟了一個(gè)內(nèi)存空間,命名為a,這時(shí)候snow這個(gè)對(duì)象引用了這片內(nèi)存空間,這片內(nèi)存空間的引用計(jì)數(shù)就是1,

同樣地當(dāng)我們創(chuàng)建了wolf這個(gè)對(duì)象之后,我們就為它開辟了一個(gè)內(nèi)存空間,命名為b,這時(shí)候wolf這個(gè)對(duì)象引用了這片內(nèi)存空間,這片內(nèi)存空間的引用計(jì)數(shù)就是1,

當(dāng)我們將snow?.pet = wolf之后,那么snow中的一個(gè)屬性也指向了創(chuàng)建wolf這個(gè)對(duì)象的內(nèi)存空間,那么這篇內(nèi)存空間的引用計(jì)數(shù)就是2.

當(dāng)我們對(duì)snow = nil進(jìn)行內(nèi)存空間的釋放,那么內(nèi)存空間a的引用計(jì)數(shù)就為0了,同時(shí)內(nèi)存空間b的引用計(jì)數(shù)就為1了。

當(dāng)系統(tǒng)發(fā)現(xiàn)一篇內(nèi)存空間的引用計(jì)數(shù)為0,那么,系統(tǒng)就會(huì)釋放這片內(nèi)存空間,此時(shí)內(nèi)存空間a就被釋放了。

但是內(nèi)存空間b的引用計(jì)數(shù)為1,系統(tǒng)不會(huì)進(jìn)行自動(dòng)的內(nèi)存釋放。只有當(dāng)我們進(jìn)行:

?
1
wolf = nil

操作之后,這片內(nèi)存空間b才會(huì)被釋放。

同樣地對(duì)于這樣代碼:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import UIKit
 
class Person{
 
 var name: String
 
 init(name: String){
  self.name = name
  print("Person", name, "is initialized")
 }
 
 deinit{
  print("Person", name, "is being deinitialized!")
 }
}
 
var person1: Person? = Person(name: "liuyubobobo")
var person2: Person? = person1
var person3: Person? = person1

那么person1的內(nèi)存空間的引用計(jì)數(shù)為3,如果釋放這片內(nèi)存空間的話,需要將三個(gè)對(duì)象都為nil

如果僅僅是將person1=nil的話,并不會(huì)釋放這一片內(nèi)存空間。

以上這篇詳談swift內(nèi)存管理中的引用計(jì)數(shù)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

原文鏈接:http://www.cnblogs.com/winterfells/archive/2017/09/04/7476485.html

延伸 · 閱讀

精彩推薦
  • SwiftSwift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Swift使用CollectionView實(shí)現(xiàn)廣告欄滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    Stevin的技術(shù)博客12372021-01-13
  • Swiftmac git xcrun error active developer path 錯(cuò)誤

    mac git xcrun error active developer path 錯(cuò)誤

    本文主要是講訴了如何解決在mac下使用git;xcode4.6的環(huán)境時(shí),出現(xiàn)了錯(cuò)誤(mac git xcrun error active developer path)的解決辦法,希望對(duì)大家有所幫助...

    Swift教程網(wǎng)2232020-12-16
  • Swiftswift where與匹配模式的實(shí)例詳解

    swift where與匹配模式的實(shí)例詳解

    這篇文章主要介紹了swift where與匹配模式的實(shí)例詳解的相關(guān)資料,這里附有簡(jiǎn)單的示例代碼,講的比較清楚,需要的朋友可以參考下...

    追到夢(mèng)的魔術(shù)師14382021-01-06
  • SwiftSwift的74個(gè)常用內(nèi)置函數(shù)介紹

    Swift的74個(gè)常用內(nèi)置函數(shù)介紹

    這篇文章主要介紹了Swift的74個(gè)常用內(nèi)置函數(shù)介紹,這篇文章列舉出了所有的Swift庫(kù)函數(shù),內(nèi)置函數(shù)是指無(wú)需引入任何模塊即可以直接使用的函數(shù),需要的朋友可...

    Swift教程網(wǎng)5802020-12-19
  • SwiftSwift中轉(zhuǎn)義閉包示例詳解

    Swift中轉(zhuǎn)義閉包示例詳解

    在Swift 中的閉包類似于結(jié)構(gòu)塊,并可以在任何地方調(diào)用,下面這篇文章主要給大家介紹了關(guān)于Swift中轉(zhuǎn)義閉包的相關(guān)資料,需要的朋友可以參考下...

    小小小_小朋友11412021-12-26
  • SwiftSwift能代替Objective-C嗎?

    Swift能代替Objective-C嗎?

    這是我在網(wǎng)上上看到的答案,復(fù)制粘貼過來(lái)和大家分享一下,因?yàn)槲液秃芏嗳艘粯雍荜P(guān)心Swift的出現(xiàn)對(duì)Mac開發(fā)的影響和對(duì)Objective-C的影響。...

    Swift教程網(wǎng)4412020-12-16
  • SwiftSwift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果

    這篇文章主要為大家詳細(xì)介紹了Swift實(shí)現(xiàn)多個(gè)TableView側(cè)滑與切換效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下...

    乞力馬扎羅的雪雪5822021-01-08
  • SwiftSwift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解

    這篇文章主要介紹了Swift教程之基礎(chǔ)數(shù)據(jù)類型詳解,本文詳細(xì)講解了Swift中的基本數(shù)據(jù)類型和基本語(yǔ)法,例如常量和變量、注釋、分號(hào)、整數(shù)、數(shù)值類型轉(zhuǎn)換等...

    Swift教程網(wǎng)5162020-12-18
主站蜘蛛池模板: 日本一区二区在线不卡 | ova催眠性指导5最新在线 | 92国产福利视频一区二区 | 男人的天堂久久精品激情a 男人的天堂va | 五月天91| a级特黄毛片免费观看 | 毛片免费在线视频 | 国产精品青青青高清在线观看 | 2015小明台湾永久区域免费 | 亚洲精品国产国语 | 亚洲精品国偷拍自产在线观看蜜臀 | 欧美日本一道高清二区三区 | 奇米影视奇米色777欧美 | 毛片的网站 | 午夜精品久久久久久久99蜜桃i | 精品福利一区 | 国语自产拍在线观看7m | 欧美成人第一页 | 免费港剧在线观看港剧 | 欧美bbxx| 色一情一区二区三区四区 | 久久www免费人成_看片高清 | 操bb视频 | 催奶师小说 | 五月天网站 | 国产成+人+综合+亚洲不卡 | 91亚洲专区 | 男女被爆动漫羞羞动漫 | xxxx18日本视频xxxxx | 四虎免费入口 | avav男人天堂| 精品亚洲456在线播放 | 国产一区二区三区久久精品 | 韩国三级在线 | 情欲满载2012美国dvd | 白丝尤物的下面被疯狂蹂躏 | 亚欧美色 | 亚洲精品AV无码永久无码 | 亚洲天天综合网 | 国产精品久久久久久久人人看 | 精品在线视频一区 |