国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:44:36
字體:
來源:轉載
供稿:網友

在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 initializedPerson snow is initializedPerson 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 = wolfsnow = nilwolf = nil

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

Person snow is initializedPet wolf is initializedPerson 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 UIKitclass 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? = person1var person3: Person? = person1

那么person1的內存空間的引用計數為3,如果釋放這片內存空間的話,需要將三個對象都為nil

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

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


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 电白县| 库尔勒市| 长海县| 乌兰浩特市| 九龙县| 盈江县| 连云港市| 鹰潭市| 景宁| 三门峡市| 原平市| 于都县| 汤原县| 新乡市| 太康县| 华宁县| 壶关县| 温宿县| 正安县| 连江县| 平泉县| 固镇县| 镶黄旗| 林周县| 中宁县| 南雄市| 定西市| 抚顺市| 滨州市| 织金县| 永兴县| 恩平市| 颍上县| 寻乌县| 新河县| 筠连县| 阿勒泰市| 屏南县| 石狮市| 徐闻县| 石狮市|