最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年09月05日 09:07:31   作者:冬日降臨  
下面小編就為大家?guī)硪黄斦剆wift內(nèi)存管理中的引用計(jì)數(shù)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

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

觀察這一段代碼:

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)建對象和deinit方法來釋放內(nèi)存空間,其中Person類中有兩個(gè)init方法,分別對應(yīng)著是否包含Pet類的名稱。

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

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

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

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

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

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

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

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

snow = nil
wolf = nil

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

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è)對象之后,我們就為它開辟了一個(gè)內(nèi)存空間,命名為a,這時(shí)候snow這個(gè)對象引用了這片內(nèi)存空間,這片內(nèi)存空間的引用計(jì)數(shù)就是1,

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

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

當(dāng)我們對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)就會釋放這片內(nèi)存空間,此時(shí)內(nèi)存空間a就被釋放了。

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

wolf = nil

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

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

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

相關(guān)文章

  • swift內(nèi)存管理指針類型使用實(shí)例詳解

    swift內(nèi)存管理指針類型使用實(shí)例詳解

    這篇文章主要為大家介紹了swift內(nèi)存管理指針類型使用實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解

    Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理詳解

    這篇文章主要給大家介紹了關(guān)于Swift實(shí)現(xiàn)監(jiān)聽鍵盤通知及一些處理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Swift data范圍截取問題解決方案

    Swift data范圍截取問題解決方案

    這篇文章主要介紹了Swift data范圍截取問題解決方案,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-09-09
  • 如何在Swift?中使用?async?let?并發(fā)運(yùn)行后臺任務(wù)

    如何在Swift?中使用?async?let?并發(fā)運(yùn)行后臺任務(wù)

    Swift?異步編程是一種編寫允許某些任務(wù)并發(fā)運(yùn)行而不是按順序運(yùn)行的代碼的方法,這篇文章主要介紹了在Swift中使用async?let并發(fā)運(yùn)行后臺任務(wù),需要的朋友可以參考下
    2023-06-06
  • Swift用final關(guān)鍵字來防止重寫

    Swift用final關(guān)鍵字來防止重寫

    final關(guān)鍵字在大多數(shù)的編程語言中都存在,表示不允許對其修飾的內(nèi)容進(jìn)行繼承或者重新操作。下面通過實(shí)例代碼給大家介紹swift用final關(guān)鍵字來防止重寫
    2016-12-12
  • Swift心得筆記之字符串

    Swift心得筆記之字符串

    Swift 的 String 類型是值類型 。 如果您創(chuàng)建了一個(gè)新的字符串,那么當(dāng)其進(jìn)行常量、變量賦值操作或在函數(shù)/方法中傳遞時(shí),會進(jìn)行值拷貝。 任何情況下,都會對已有字符串值創(chuàng)建新副本,并對該新副本進(jìn)行傳遞或賦值操作。
    2015-04-04
  • Swift教程之集合類型詳解

    Swift教程之集合類型詳解

    這篇文章主要介紹了Swift教程之集合類型詳解,Swift 提供兩種集合類型來存儲集合,數(shù)組和字典,本文詳細(xì)講解了數(shù)組的創(chuàng)建、讀取和修改數(shù)組、遍歷數(shù)組以及集合的操作等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體

    Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體

    最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-03-03
  • Swift中內(nèi)置的集合類型學(xué)習(xí)筆記

    Swift中內(nèi)置的集合類型學(xué)習(xí)筆記

    Swift中自帶數(shù)組、set、字典三大集合類型,這里將學(xué)習(xí)過程中的基礎(chǔ)的Swift中內(nèi)置的集合類型學(xué)習(xí)筆記進(jìn)行整理,需要的朋友可以參考下
    2016-06-06
  • 在 Swift 中測試 UIAlertController的方法

    在 Swift 中測試 UIAlertController的方法

    這篇文章主要介紹了在 Swift 中測試 UIAlertController的方法的,需要的朋友可以參考下
    2015-10-10

最新評論

蒙自县| 宁都县| 武邑县| 克东县| 乌兰察布市| 景泰县| 虎林市| 金沙县| 澄江县| 济宁市| 昭通市| 栖霞市| 娱乐| 揭东县| 房产| 闸北区| 平塘县| 嘉黎县| 天津市| 玉田县| 余姚市| 恩平市| 宜宾市| 万盛区| 阜康市| 敖汉旗| 治多县| 鄯善县| 于田县| 天全县| 新干县| 虹口区| 墨江| 金堂县| 徐汇区| 安溪县| 宁陵县| 依兰县| 阳城县| 饶平县| 吴桥县|