iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
Mobile Development

iOS學習資源與筆記系列 第 7

Automatic Reference Counting

  • 分享至 

  • xImage
  •  

記錄學習內容。
主要是看網路上的文章和影片,做些紀錄。
大部分內容來自網路上大大們的文章
內容可能有錯誤。

學習:
Swift基礎 — ARC 記憶體管理Weak 、Unowned

關於Memory leak 的安全問題

Swift Fun Algorithms: How to Create a Retain Cycle?

Swift Fun Algorithms: Retain Cycle Correction!

Swift Fun Algorithms: Closure Reference Cycles

Automatic Reference Counting

整理

1

Memory leak(記憶體流失):

讓物件死亡,但它卻還活著占用記憶體。

2

C 語言的 Memory leak 的安全問題:

在程式結束之後,記憶體雖然被系統收回,
但是那些記憶體中的資料卻還是存在那裡 。
如果有別之程式想要拿這些資料,還是拿的到。
解決方法:可以程式結束前,把東西都變成0

3

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 是一樣的

4 結論:


都不加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物件!!!

5

最後有講到
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)

上一篇
Http、Json、Semaphores
下一篇
SwiftUI 畫面練習
系列文
iOS學習資源與筆記28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言