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

2021-08-07 18:42:00 字數 2122 閱讀 7554

在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit()函式進行釋放記憶體空間。

觀察這一段**:

class

person

init(name: string, petname: string)

deinit

}class

pet

deinit

}

這段**建立了兩個類,分別是person類和pet類,每個類中都有init方法進行建立物件和deinit方法來釋放記憶體空間,其中person類中有兩個init方法,分別對應著是否包含pet類的名稱。

當我們呼叫這兩個方法:

var snow: person? = person(name: "

snow

", petname: "

wolf")

snow = nil

兩步的執行結果是:

pet wolf is

initialized

person snow

isinitialized

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

isinitialized

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

deinit

}var person1: person? = person(name: "

liuyubobobo")

var person2: person? =person1

var person3: person? = person1

那麼person1的記憶體空間的引用計數為3,如果釋放這片記憶體空間的話,需要將三個物件都為nil

如果僅僅是將person1=nil的話,並不會釋放這一片記憶體空間。

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

在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit 函式進行釋放記憶體空間。觀察這一段 class person init name string,petname string deinit class pet deinit 這段 建立了兩個類,分別是person類和pet類,...

記憶體管理之引用計數

在一些開發語言中,記憶體管理使用的是引用計數的方法,比如python objc等。採用引用計數,開發人員不需要管理記憶體,能夠從記憶體管理繁瑣的工作中脫離出來,從而將更多的精力花費在開發程式上。引用計數的原理 python和objc中的每個物件內部都維護著乙個引用計數器,當新建乙個物件,或者有其他物...

swift自動引用計數

在少數情況下,arc為了能幫助你管理記憶體,需要更多的關於你的 之間關係的資訊 引用計數僅僅應用於類的例項,結構體和列舉型別是值型別,不是引用型別,也不是通過引用的方式儲存和傳遞 為了使之成為可能,無論你將例項賦值給屬性,常量或者是變數,屬性,常量或者變數,都會對此例項建立強引用。之所以稱之為強引用...