[英]What is the difference in Swift between 'unowned(safe)' and 'unowned(unsafe)'?
除了weak
和unowned
之外,Apple 的Swift 編程語言指南還提到了捕獲說明符unowned(safe)
和unowned(unsafe)
。
我(認為我)理解weak
和unowned
之間的區別; 但是unowned(safe)
和unowned(unsafe)
之間有什么區別? 導游沒說。
請:不要僅僅依賴於聲明一個 Objective-C 的等價物。
據我了解,雖然我無法從 Apple 找到明確的來源,但unowned
可以分為兩種, safe
和unsafe
。
裸unowned
是unowned(safe)
:它是一個特殊包裝的引用,當引用釋放的實例時會拋出異常。
特殊情況是unowned(unsafe)
:它是 Objective C 的@property (assign)
或__unsafe_unretained
的 Swift 等價物。 它不應該在 Swift 程序中使用,因為它的目的是連接到用 Objective C 編寫的代碼。
因此,在查看 Cocoa 類的導入包裝器時,您會看到unowned(unsafe)
,但除非必須,否則不要使用它,並且您會知道何時必須使用。
更新
__unsafe_unretained
是一個簡單的指針。 它不知道指向的實例何時被釋放,因此當它被取消引用時,底層內存可能是垃圾。
如果您有使用釋放的__unsafe_unretained
變量的缺陷,您將看到不穩定的行為。 有時該內存位置足夠好,因此代碼可以運行,有時它會被部分覆蓋,因此您會遇到非常奇怪的崩潰,有時該內存位置將包含一個新對象,因此您將獲得無法識別的選擇器異常。
__unsafe_unretained
指定一個引用,該引用不會使被引用的對象保持活動狀態,並且在沒有對該對象的強引用時不設置為 nil。 如果它引用的對象被釋放,則指針懸空。
以下是來自Apple Developer Forums的引用:
unowned
vs unowned(safe)
vs unowned(unsafe)
unowned(safe)
是一個非擁有引用,它在訪問時斷言對象仍然存在。 它有點像一個弱可選引用,它隱式地用x!
解包了x!
每次訪問時。unowned(unsafe)
就像 ARC 中的__unsafe_unretained
它是一個非擁有引用,但沒有運行時檢查對象是否在訪問時仍然存在,因此懸空引用將進入垃圾內存。unowned
目前始終是unowned(safe)
的同義詞,但其目的是在禁用運行時檢查時在-Ofast
構建中將其優化為-Ofast
unowned(unsafe)
。
變量在已使用屬性解除分配時被訪問:
一個簡單的定義。 這將消除混亂。
-- 無主屬性:如果您在其引用的實例被釋放后嘗試訪問無主引用,您的程序將崩潰。
-- unowned(Unsafe) 屬性:如果你在引用的實例被釋放后嘗試訪問一個不安全的無主引用,你的程序將嘗試訪問該實例曾經所在的內存位置,這是一個不安全的操作。 (不保證這會執行還是崩潰)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.