自動引用計數

2021-07-24 10:19:30 字數 4502 閱讀 4366

每當你產生乙個物件,arc分配一大塊控制項去儲存這個物件。

除此之外,當乙個物件是不在需要,arc 將會收回這個例項物件所佔的空間。

如果乙個物件的空間被釋放掉,但是你任然通過物件的引用呼叫方法或者屬性,你的程式將要崩潰。

為了不讓物件被釋放掉 arc將會追蹤有多少屬性、常量、變數正在引用這個物件。只要有乙個在引用他 arc 將不會釋放這個物件。

因此當年給屬性、常量或者變數賦值的時候,應該確保強引用這個物件。

例子:class person

deinit

}定義三個變數,因為是可選型別,所以自動賦值為 nil

var reference1: person?

var reference2: person?

var reference3: person?

//引用計數變為1

//引用計數變為3

reference2 = reference1

reference3 = reference1

//引用計數變為1

reference1 = nil

reference2 = nil

//引用計數變為0

reference3 = nil

當兩個物件相互強引用對方,將會造成迴圈引用的情況,這會導致空間浪費。我們可以用弱引用或者打破這種情況。

下面是迴圈引用的例子:

class person

var apartment: apartment?

deinit

}class apartment

var tenant: person?

deinit

}var john: person?

var unit4a: apartment?

unit4a = apartment(unit: "4a")

引用情況:

現在的引用情況:

這樣導致了迴圈引用,導致空間無法釋放。
swift 用兩種方式來解決迴圈引用問題既弱引用和無主引用。

弱引用和無主引用確保乙個物件在迴圈引用中沒有強引用另乙個物件。當乙個物件的

存在時間小於另乙個物件,我們可以用弱引用。當另乙個物件有相同的生存時間或者更長

我們應該用無主引用來打破這個迴圈。

弱引用
弱引用不增加物件的引用計數,當引用物件被 arc 釋放的時候,弱引用的值將會變為 

nil。因此弱引用應該被宣告為變數。要注意的是當 arc把弱引用變為 nil 的時候,屬

性觀察者不會被呼叫。

無主引用

無主應用不會增加物件的引用計數,當所引用的物件被釋放的時候, arc 不會吧無

主引用變為 nil。因此無主引用不能為可選值

上面是安全的無主引用,我們可以用 unowned(unsafe)來定義不安全的無主引用,

這意味你有責任來保證**的安全。否則當物件被釋放後,你任然用無主引用來引用物件

所在空間,會導致不可預料的錯誤。

無主引用和含蓄的解包
person 和 apartment 列子中的情況是兩個互相引用的屬性都可以是 nil,因

此,我們可以用弱引用。

customer 和 creditcard 例子中的情況是其中有乙個可以為 nil,因此我們可

以用無主引用來打破迴圈。

但是還有一種情況是兩個屬性在初始化完成後都不可以為nil,在這種情況下我們可以在乙個類設定無主引用,在另乙個為類自動解包可選屬性。

class country

}class city

}var country = country(name: "canada", capitalname: "ottawa")

print("\(country.name)'s capital city is called \(country.capitalcity.name)")

// prints "canada's capital city is called ottawa"

當閉包是類的乙個屬性,並且閉包捕獲了這個類本身,那麼將會發生迴圈引用。當在

閉包體裡引用本例項的屬性時,例如 self.someproperty 或者閉包呼叫乙個方法例如

self.somemethod()。上面的情況都會導致閉包捕獲本例項物件,導致迴圈引用。

閉包是乙個引用型別,當把閉包賦值給乙個屬性,那麼屬性強引用閉包。

swift中可以用閉包捕獲列表來解決這個問題

下面的例子展示如何利用導致迴圈引用:

導致了迴圈引用
我們可以定義乙個捕獲列表,來說明閉包和他捕獲物件引用的關係。
第一捕獲列表
捕獲列表的每一項都是 weak 或者unowned 關鍵字和乙個類的例項

變數(such as self)或者乙個變數的初始化(such as delegate = self.delegate!)

放置捕獲列表在閉包的引數列表和返回值前:

lazy var someclosure: (int, string) -> string =

弱引用和無主引用
當閉包和其捕獲的引用將要一直引用彼此並且一同被**,我們可以用

無主引用。相反的,如果乙個物件在一些情況下可能成為 nil,用弱引用。

自動引用計數

使用弱引用解決迴圈強引用 如果兩個變數屬性都可以設定為nil,那麼就用弱引用來設定其中乙個屬性來解決迴圈強引用。class person weak var apartment apartment?deinit class apartment deinit var aperson person?per...

ARC(自動引用計數)

arc arc是automatic reference counting 自動引用計數 的縮寫,是ios5一同推出的新特性,但是ios4.3也支援arc,只是不能使用weak。使用arc,不需要再retain release autorelease,因為編譯器會在合適的地方自動的插入retain r...

swift自動引用計數

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