激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

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

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

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

下面小編就為大家?guī)硪黄斦剆wift內(nèi)存管理中的引用計數(shù)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

swift中,每一個對象都有生命周期,當生命周期結(jié)束會調(diào)用deinit()函數(shù)進行釋放內(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)建了兩個類,分別是Person類和Pet類,每個類中都有init方法進行創(chuàng)建對象和deinit方法來釋放內(nèi)存空間,其中Person類中有兩個init方法,分別對應著是否包含Pet類的名稱。

當我們調(diào)用這兩個方法:

?
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!

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

但是如果我們調(diào)用第一種init方法的時候我們會發(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)建了一個snow對象,之后又創(chuàng)建了一個wolf對象,然后將wolf添加到snow對象中去,但是當我們對這snow這個對象進行內(nèi)存釋放的時候會發(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)存管理中的引用計數(shù)有關了:

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

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

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

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

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

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

?
1
wolf = nil

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

同樣地對于這樣代碼:

?
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)存空間的引用計數(shù)為3,如果釋放這片內(nèi)存空間的話,需要將三個對象都為nil

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

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

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

延伸 · 閱讀

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

    Swift使用CollectionView實現(xiàn)廣告欄滑動效果

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

    Stevin的技術博客12372021-01-13
  • Swiftmac git xcrun error active developer path 錯誤

    mac git xcrun error active developer path 錯誤

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

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

    swift where與匹配模式的實例詳解

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

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

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

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

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

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

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

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

    Swift能代替Objective-C嗎?

    這是我在網(wǎng)上上看到的答案,復制粘貼過來和大家分享一下,因為我和很多人一樣很關心Swift的出現(xiàn)對Mac開發(fā)的影響和對Objective-C的影響。...

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

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

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

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

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

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

    Swift教程網(wǎng)5162020-12-18
主站蜘蛛池模板: av成人在线免费观看 | 特级a欧美做爰片毛片 | 免费激情网站 | 娇喘在线 | 毛片视频网站 | 黄网站免费入口 | bt 自拍 另类 综合 欧美 | 91免费大片| 免费观看一级黄色片 | 欧美日韩专区国产精品 | 久久成年人视频 | 爱草在线 | 吾色视频 | 老女人碰碰在线碰碰视频 | 午夜视频在线观看免费视频 | 日本网站一区二区三区 | 91精品国产日韩91久久久久久360 | 91真视频 | 成人三级电影在线 | 手机免费看一级片 | 黄色a级片视频 | 国产1区视频 | 国产毛片视频 | 久久久久久久久久久久免费 | 国产高潮好爽受不了了夜色 | 99riav视频一区二区 | 毛片在线视频免费观看 | 日韩一级成人 | 久久国产精品影视 | 中文字幕在线一 | 激情国产视频 | 欧美激情第一区 | 国产精品v片在线观看不卡 成人一区二区三区在线 | 久久午夜国产 | 国产无限资源在线观看 | 久久国产精品二国产精品 | 国产刺激高潮av | 一级做a爱片久久毛片a高清 | 亚洲精品在线观看免费 | 一级网站 | 日韩精品一区二区在线播放 |