swift記憶體管理中的引用計數

來源:互聯網
上載者:User

標籤:調用   觀察   也會   記憶體釋放   int   var   就會   str   管理   

在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記憶體管理中的引用計數

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.