14 6 Swift中weak解決迴圈強引用

2021-07-25 13:27:06 字數 2465 閱讀 4906

/** (6

)迴圈強引用

arc不是萬能的,它可以很好的解決記憶體過早釋放的問題,

但是在某些場合下不能很好的解決記憶體洩漏的問題。 */

/**

迴圈強引用是造成記憶體洩漏的原因。接下來我們還是用**來給大家講解什麼是迴圈強引用。

直接用官方例子 */

class

person

varapartment:

apartment?

deinit }

class

apartment

vartenant:

person?

deinit }

/**

兩個類各有乙個屬性,每個屬性都是對方類的型別的屬性,而這兩個屬性互相持有對方。

這就是所謂的迴圈強引用 */

// 這是強引用,不要認為可選型別就是弱引用啊,只有通過

weak unowned

才是弱引用

varjohn:

person?

varnumber73:

apartment?

john =

person

.init

(name:)

number73 =

apartment

.init

(number:73)

/**

上面的四句換對應

迴圈強引用講解圖

/**這裡面

apartment

和tenant

兩個物件是強引用,

也就是下面的

john

和number73

設定為nil

只是他們的強引用斷開。 */

john!.

apartment

= number73

number73!.

tenant

= john

/**

我們可以看到在析構方法中沒有列印,也就是這兩個物件他們沒有被銷毀,造成了記憶體洩漏。但是我們沒有辦法在訪問他們。

對應的迴圈強引用講解圖

2.png */

john =

nil

number73 =

nil

/**相互強引用或者說迴圈強引用會造成記憶體洩漏,為什麼?

因為一塊記憶體的釋放的判斷是沒有物件占用它,相互強引用,那到底誰先釋放呢?誰也不願意先釋放。 */

/**在變數

tenant前加上

weak修飾,

也就是將其中的乙個變數設定為弱引用就行了。 */

class

apartment1

weak

vartenant:

person?

deinit }

print

("--------------------->>")

varjohn1:

person?

varnumber74:

apartment1?

john1 =

person

.init

(name:)

number74 =

apartment1

.init

(number:74)

/**

上面的四句換對應

迴圈強引用講解圖

這裡面apartment

和tenant

兩個物件是強引用,

也就是下面的

john

和number73

設定為nil

只是他們的強引用斷開。 */

john1!.

apartment

= number73

number74!.

tenant

= john

/**列印出來

--------------------->>

apartment #74 is being deininialized

迴圈強引用講解圖

4.png

john1

物件的強引用沒有了,設定為

nil時被銷毀,釋放記憶體。同時

number74

所指向的記憶體也被釋放了。 */

Swift中的weak和unowned關鍵字

swift中沒有了strong,assign,copy關鍵字,對於所有的class型別變數都預設採用了strong型別,如果需要指定使用weak,則需要新增weak關鍵字修飾。正是由於這種預設的strong型別,在閉包中會引起迴圈引用,導致記憶體無法釋放,為了能夠在閉包 block 中正常釋放記憶體...

swift中的迴圈語句

swift 中的迴圈語句主要有以下幾種型別1 for語句,遍歷乙個集合裡面的所有元素,例如由數字表示的區間 陣列中的元素 字串中的字元。2 for.in 語句,用來重複執行一系列語句直到達成特定條件達成,一般通過在每次迴圈完成後增加計數器的值來實現。3 while 語句,執行一系列語句,如果條件為 ...

Swift類例項與迴圈引用的解決

情形1 兩個屬性的值都允許為nil,這種場景最適合用弱引用來解決 class person 弱引用 var apartment apartment?deinit class apartment 弱引用 weak var tenant person?deinit var john person?per...