三十二 Swift5 0之 記憶體相關

2021-07-31 02:11:58 字數 1925 閱讀 9829

/*

swift記憶體管理:

管理引用型別的記憶體, 不會管理值型別, 值型別不需要管理

記憶體管理原則: 當沒有任何強引用指向物件, 系統會自動銷毀物件

(預設情況下所有的引用都是強引用)

如果做到該原則: arc

*/class

person

deinit

}var p:

person?=

person

(name:

"gezi"

)//p = nil

/*weak弱引用

*/class

person2

deinit

}// 強引用, 引用計數+1

var strongp =

person2

(name:

"gezi"

)// 1

var strongp2 = strongp // 2

// 弱引用, 引用計數不變

// 如果利用weak修飾變數, 當物件釋放後會自動將變數設定為nil

// 所以利用weak修飾的變數必定是乙個可選型別, 因為只有可選型別才能設定為nil

weak

var weakp:

person2?=

person2

(name:

"gezi")if

let p = weakp

else

/*unowned無主引用 , 相當於oc unsafe_unretained

unowned和weak的區別:

1.利用unowned修飾的變數, 物件釋放後不會設定為nil. 不安全

利用weak修飾的變數, 物件釋放後會設定為nil

2.利用unowned修飾的變數, 不是可選型別

利用weak修飾的變數, 是可選型別

什麼時候使用weak?

什麼時候使用unowned?

*/class

person3

deinit

}unowned

var weakp3:

person3

=person3

(name:

"gezi")/*

迴圈引用

arc不是萬能的, 它可以很好的解決記憶體問題, 但是在某些場合不能很好的解決記憶體洩露問題

例如兩個或多個物件之間的迴圈引用問題

*/class

person4

deinit

}class

apartment

deinit

}var p4:

person4?=

person4

(name:

"gezi"

)var a4:

apartment?=

apartment

(number:

888)

p4!.apartment = a4 // 人有一套公寓

a4!.tenant = p4!

// 公寓中住著乙個人

// 兩個物件沒有被銷毀, 但是我們沒有辦法訪問他們了. 記憶體洩露

p4 =

nila4 =

nilclass

person5

deinit

}class

creditcard

deinit

}var p5:

person5?=

person5

(name:

"gezi"

)var cc:

creditcard?=

creditcard

(number:

8888888

, person: p5!

)p5 =

nilcc =

nil

二十二 Swift5 0之 列舉

全系列導航 swift5.0 系列部落格索引 swift列舉 swift中的列舉比oc中的列舉強大,因為swift中的列舉是一等型別,它可以像類和結構體一樣增加屬性和方法 格式 enum method enum method 可以使用列舉型別變數或常量接收列舉值 var m method add 注...

四 Swift 5 0之 Bool型別

全系列導航 swift5.0 系列部落格索引 c語言和oc並沒有真正的bool型別 c語言的bool型別非0即真 oc語言的bool型別是typedef signed char bool swift引入了真正的bool型別 bool true false let isopen bool true l...

六 Swift5 0之 可選值

全系列導航 swift5.0 系列部落格索引 可選值 optionals有兩種狀態 1.有值 2.沒有值,沒有值就是nil 有值 var optvalue1 int?9 沒有值 var optvalue2 int?var optvalue3 int?nil 可選值可以利用if語句來進行判斷 var ...