久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

詳談swift內存管理中的引用計數

下面小編就為大家帶來一篇詳談swift內存管理中的引用計數。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

在swift中,每一個對象都有生命周期,當生命周期結束會調用deinit()函數進行釋放內存空間。

觀察這一段代碼:


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!")
 }
}

這段代碼創建了兩個類,分別是Person類和Pet類,每個類中都有init方法進行創建對象和deinit方法來釋放內存空間,其中Person類中有兩個init方法,分別對應著是否包含Pet類的名稱。

當我們調用這兩個方法:


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

兩步的執行結果是:


Pet wolf is initialized
Person snow is initialized
Person snow is deinitialized!
Pet wolf is deinitialized!

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

但是如果我們調用第一種init方法的時候我們會發現:


var snow: Person? = Person(name: "snow")

var wolf: Pet? = Pet(name: "wolf")
snow?.pet = wolf

snow = nil
wolf = nil

我們首先創建了一個snow對象,之后又創建了一個wolf對象,然后將wolf添加到snow對象中去,但是當我們對這snow這個對象進行內存釋放的時候會發現:


Person snow is initialized
Pet wolf is initialized
Person snow is deinitialized!

僅僅只有snow的內存空間被釋放了,但是wolf的內存空間并沒有被釋放,這里就和swift內存管理中的引用計數有關了:

當我們創建了snow這個對象之后,我們就為它開辟了一個內存空間,命名為a,這時候snow這個對象引用了這片內存空間,這片內存空間的引用計數就是1,

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

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

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

當系統發現一篇內存空間的引用計數為0,那么,系統就會釋放這片內存空間,此時內存空間a就被釋放了。

但是內存空間b的引用計數為1,系統不會進行自動的內存釋放。只有當我們進行:


wolf = nil

操作之后,這片內存空間b才會被釋放。

同樣地對于這樣代碼:


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

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

以上這篇詳談swift內存管理中的引用計數就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持html5模板網。

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

這篇文章主要給大家介紹了關于RxSwift學習教程之類型對象Subject的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著
這篇文章主要給大家介紹了關于RxSwift學習教程之Observable的相關資料,文中詳細的給大家介紹了關于新建Observable、訂閱Observable和取消訂閱并消除內存泄漏等相關的內容,需要的朋友可以
RxSwift是Swift函數響應式編程的一個開源庫,由Github的ReactiveX組織開發,維護。下面這篇文章主要給大家介紹了關于RxSwift學習之基礎篇的相關資料,文中通過示例代碼介紹的非常詳細,需
這篇文章主要為大家詳細介紹了Swift4.0 Array數組的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
CATransition動畫主要在過渡時使用,比如兩個頁面層級改變的時候添加一個轉場效果。CATransition分為兩類,一類是公開的動畫效果,一類是非公開的動畫效果。這篇文章主要給大家介紹了
近日,iPhone X的發布在人們群眾引起了很大的轟動,下面這篇文章主要給大家介紹了關于利用Swift如何判斷iPhone X機型的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友們下面
主站蜘蛛池模板: 激情视频一区 | 日韩一区和二区 | 国产精品久久久久久久久久久久 | 国产91在线 | 中日 | 美国一级片在线观看 | 一级a性色生活片久久毛片 一级特黄a大片 | 99精品热视频 | 日韩在线第一 | 久久精品视频在线观看 | 日本不卡免费新一二三区 | 日韩精品一区二区在线 | 久久久久久国产精品免费免费男同 | 日韩二区 | 国产日韩欧美精品一区二区三区 | 国产亚洲精品久久久优势 | 久久久精品一区 | 久久国产日本 | 男女视频在线观看网站 | 欧美激情黄色 | 人人看人人爽 | 日韩国产三区 | 亚洲成人免费视频 | 精品国产乱码久久久久久88av | 欧美亚洲一区二区三区 | 精品国产乱码久久久久久果冻传媒 | 国产露脸国语对白在线 | 久久精品综合 | 1级毛片| 国产美女在线免费观看 | 亚洲天堂精品一区 | 欧美日韩网站 | 毛片视频网站 | 成人在线视频免费观看 | 日韩视频免费 | 久草综合在线视频 | 日日干干夜夜 | 999国产精品视频免费 | 中文字幕在线观看一区 | 亚洲一区黄色 | 亚洲国产欧美在线人成 | 欧美高清视频在线观看 |