在swift中,每乙個物件都有生命週期,當生命週期結束會呼叫deinit()函式進行釋放記憶體空間。
觀察這一段**:
classperson
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 isinitialized
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 isinitialized
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 uikitclass
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為了能幫助你管理記憶體,需要更多的關於你的 之間關係的資訊 引用計數僅僅應用於類的例項,結構體和列舉型別是值型別,不是引用型別,也不是通過引用的方式儲存和傳遞 為了使之成為可能,無論你將例項賦值給屬性,常量或者是變數,屬性,常量或者變數,都會對此例項建立強引用。之所以稱之為強引用...