weak與unowned都不擁有目標,但釋放後的行為不同。weak會變成nil;透過安全的unowned存取已釋放目標則會觸發執行階段錯誤。選擇依據是生命週期保證,而不只是可選型別語法。
原理與設計判斷
ARC結合編譯器產生的所有權操作與執行階段的參考管理。強參考循環中的物件可能在外部擁有者消失後仍存在。unowned也可以是可選參考,但開發者必須確保它指向存活物件,或明確設為nil。 第一手資料
重現程式碼
第一個實驗讓兩個Node互相擁有,移除外部強參考後透過weak觀察存活,再切斷一條連線。第二個讓父物件強參考子物件、子物件以weak反向參考。最後在Owner仍存活時,手動清除可選的unowned參考。
這個獨立範例已於 2026-10-23 使用 Apple Swift 6.4,以 Swift 6 語言模式在 arm64 macOS 目標環境執行。不需要網路或額外套件。
請在下載檔案的資料夾執行。檢查不符時,precondition 會中止程式。請勿使用 -Ounchecked,因為它會移除這些檢查。
swift -swift-version 6 swift-arc-weak-unowned.swift
final class Node { var next: Node? }
func breakCycle(_ node: Node) { node.next = nil }
weak var observedA: Node?
weak var observedB: Node?
do {
let a = Node()
let b = Node()
a.next = b
b.next = a
observedA = a
observedB = b
}
precondition(observedA != nil && observedB != nil)
breakCycle(observedA!)
precondition(observedA == nil && observedB == nil)
final class Owner { var child: Child? }
final class Child { weak var owner: Owner? }
weak var observedOwner: Owner?
weak var observedChild: Child?
do {
let owner = Owner()
let child = Child()
owner.child = child
child.owner = owner
observedOwner = owner
observedChild = child
}
precondition(observedOwner == nil && observedChild == nil)
final class Borrower {
unowned var owner: Owner?
init(_ owner: Owner) { self.owner = owner }
}
do {
let owner = Owner()
let borrower = Borrower(owner)
withExtendedLifetime(owner) {
precondition(borrower.owner === owner)
borrower.owner = nil
precondition(borrower.owner == nil)
}
}
print("cycle=retained broken=released weak=nil unowned-optional=manually-cleared")
執行結果與解讀
cycle=retained broken=released weak=nil unowned-optional=manually-cleared
強參考循環在區塊結束後仍存在,切斷一條連線後兩個觀察值才變成nil。使用weak反向參考的父子關係在強參考消失後釋放。unowned可選參考的nil來自程式主動賦值,不是執行階段自動歸零。
適用範圍與限制
本程式不存取已失效的unowned,也沒有聲稱實測那種崩潰。不能保證物件一定在特定原始碼行釋放,最佳化與生命週期延長都可能影響。缺少deinit紀錄也不能直接證明洩漏,快取或非同步工作可能合法持有物件。
接下來要確認的事
先畫所有權圖,判斷反向關係是否需要擁有目標。允許目標先消失時用weak;存取期間保證存活才考慮unowned。若問題來自儲存的閉包持有自身物件,可接著看捕捉實驗。
來源與驗證
- The Swift Programming Language: Automatic Reference CountingSwift.org · 官方文件 · 查核 2026年10月23日依據: 實作契約與說明的依據。執行輸出另外透過本文所附實驗確認。

