記錄學習內容。
主要是看網路上的文章和影片,做些紀錄。
大部分內容來自網路上大大們的文章
內容可能有錯誤。
學習:
Swift基礎 — ARC 記憶體管理Weak 、Unowned
Swift Fun Algorithms: How to Create a Retain Cycle?
Swift Fun Algorithms: Retain Cycle Correction!
Swift Fun Algorithms: Closure Reference Cycles
整理
Memory leak(記憶體流失):
讓物件死亡,但它卻還活著占用記憶體。
C 語言的 Memory leak 的安全問題:
在程式結束之後,記憶體雖然被系統收回,
但是那些記憶體中的資料卻還是存在那裡 。
如果有別之程式想要拿這些資料,還是拿的到。
解決方法:可以程式結束前,把東西都變成0
Unowned:{期待}所參考的記憶體位置一定有東西的
weak所參考的記憶體 有沒有 東西都無所謂
Unowned References 的用法 ,情境有:
一 顧客可能沒有信用卡 (?), 但是信用卡一定有顧客 (unowned let 顧客)。
顧客 跑了 , 信用卡就沒了(因為信用卡一定有顧客)
信用卡沒了 ,顧客還在。
二
骨頭一定要有狗,才能被創建。
在骨頭裡,(unowned let dog) : 代表創建骨頭時,要有dog,然後dog不能nil 。
不能這樣 釋放lucky:
Var lucky : Dog? = Dog(name: "Lucky")
var bone : Bone = Bone(owner: lucky)
lucky = nil
加個! 就可以了 , (因為 ! 代表一定有物件 ,?代表不一定有物件) :
Var lucky : Dog? = Dog(name: "Lucky")
var bone : Bone = Bone(owner: lucky!)
lucky = nil
三
原本以為unowned ,一定要給一個不是nil的東西。
或許不一定,swift文件有寫:
The difference is that when you use an unowned optional reference, you’re responsible for making sure it always refers to a valid object or is set to nil.
可以這樣:
unowned let customer: Customer
也可以這樣:
unowned var customer: Customer?
不知道有沒有錯,但是程式再跑的時候,
unowned var customer: Customer?
跟
weak var customer: Customer?
的效果是一樣的
推測:
unowned > weak
Unowned 比weak 多一個功能:
unowned let customer: Customer (一定要帶一個物件!!!)
其餘Unowned 跟 weak 是一樣的
一
都不加Unowned 、 weak,有可能發生 記憶體流失(Memory leak) 。
當 我把 物件 = nil 的時候 ,他還活著 。
物件 只要 有連結 ,就不會死 。
二
為什麼要加Unowned 、 weak ?
(把 物件 = nil 的時候 ,會自動斷開其他連結,他就死了)(這樣理解是錯的)
應該是 弱參考 不會增加reference count ,所以reference count只有當初創建物件的 +1
如果一個物件 的 reference count 是 0 , 記憶體就會被釋放.
這種機制稱為 Automatic Reference Counting (ARC) , Automatic(自動的,因為swift處理好了)
What is Automatic Reference Counting (ARC)?
https://www.hackingwithswift.com/example-code/language/what-is-automatic-reference-counting-arc
Easy way to check reference count for an object
https://stackoverflow.com/questions/57129799/easy-way-to-check-reference-count-for-an-object/62307019#62307019
三
Unowned 比weak 多一個功能 :
可以變成這樣:
unowned let customer: Customer
這方法一定要帶一個Customer物件!!!
最後有講到
Html的例子 (a closure and a class): closure 取得自己(self)屬性會沒辦法 nil。
其他:
1
怎麼知道 某個東西 的 type ?
How do you find out the type of an object (in Swift)?
type(of: yourObject)