自動引用計數

2021-09-25 08:19:00 字數 2341 閱讀 4406

使用弱引用解決迴圈強引用

如果兩個變數屬性都可以設定為nil,那麼就用弱引用來設定其中乙個屬性來解決迴圈強引用。

class person 

weak var apartment: apartment?

deinit

}class apartment

deinit

}var aperson: person? = person(name: "小明")

var aapartment: apartment? = apartment(unit: "豪宅",person: aperson!)

aperson!.apartment = aapartment

aperson = nil

aapartment = nil

無主引用

如果兩個變數屬性,其中乙個可以設定成nil,另乙個必須有值。那麼這時候可以設定必須有值得屬性為無主引用來解決迴圈強引用

cclass person 

var apartment: apartment?

deinit

}class apartment

deinit

}var aperson: person? = person(name: "小明")

var aapartment: apartment? = apartment(unit: "豪宅",person: aperson!)

aperson!.apartment = aapartment

aperson = nil

aapartment = nil

無主引用和隱士解包可選值屬性

如果兩個屬性都必須有值,這時候把其中乙個設定為無主引用,並正常完成構造器。

把另乙個屬性設定成隱士解包可選屬性,並將構造器傳入乙個完成另乙個物件初始化的字串引數(看情況)之後在利用另乙個構造器完成初始化即可。

class person 

var apartment: apartment!

deinit

}class apartment

deinit

}var aperson: person? = person(name: "小明", apartment: "豪宅")

var aapartment: apartment? = aperson!.apartment

aperson = nil

aapartment = nil

閉包內部使用方法,或者屬性,必須顯示的通過self呼叫。不能直接使用這些屬性和方法。

這是因為swift時刻提醒我們閉包內部有可能造成迴圈強引用。

用捕獲列表解決閉包的迴圈強引用

swift中要求在閉包裡必須使用self顯示呼叫屬性和方法。

如果在閉包內發生了捕獲,那麼就要在閉包的引數列表和返回型別前面寫上捕獲列表來解決迴圈強引用。

如果這個閉包是不能設定成nil的那就要用無主引用。如果這個閉包可以設定成nil的,那就用弱引用。

class htmlelement else

}init(name: string, text: string)

deinit

}var a: htmlelement? = htmlelement(name: "h1", text: "hello world!")

print(a!.ashtml())

a = nil

總結

列舉,結構體,字串等都是值型別。儲存在棧中,是編譯器進行記憶體管理,不用我們管理記憶體。

物件,引用型別是存在堆中。需要我們進行記憶體管理。arc可以利用引用計數幫我們自動記憶體管理,但是有些情況下,如果我們不進行特殊處理會造成記憶體洩露。

兩個物件的屬性相互迴圈強引用

如果這兩個屬性都是可以設定成nil,那就把其中乙個屬性用弱引用。

如果兩個屬性其中乙個是可以設定成nil,另乙個必須要有值。那麼就把必須有值的屬性用無主引用。

如果兩個屬性都是必須有值的,那麼就把其中乙個屬性用無主引用型別,然後進行正常構造。另乙個屬性用隱士解包可選型別,然後傳入乙個引數字串(看情況用什麼型別),之後在這個構造器中呼叫另乙個類的構造器進行構造。

閉包 閉包內swift要求必須通過顯示的self呼叫屬性和方法。(這樣可以時刻提醒我們迴圈強引用問題)

當發現閉包內部有導致發生迴圈強引用的物件時候,也就是發現有捕獲物件時候,我們要用捕獲列表解決迴圈強引用。

如果這個閉包有引數列表和返回值,那就在引數列表前邊寫捕獲列表。如果這個閉包能夠設定成nil,就用弱引用。如果不能就用無主引用。

如果閉包內部沒有引數列表和返回值,那就自己寫乙個in,在in前邊寫捕獲列表。

自動引用計數

每當你產生乙個物件,arc分配一大塊控制項去儲存這個物件。除此之外,當乙個物件是不在需要,arc 將會收回這個例項物件所佔的空間。如果乙個物件的空間被釋放掉,但是你任然通過物件的引用呼叫方法或者屬性,你的程式將要崩潰。為了不讓物件被釋放掉 arc將會追蹤有多少屬性 常量 變數正在引用這個物件。只要有...

ARC(自動引用計數)

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

swift自動引用計數

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