簡體   English   中英

Swift 中“無主(安全)”和“無主(不安全)”之間的區別是什么?

[英]What is the difference in Swift between 'unowned(safe)' and 'unowned(unsafe)'?

除了weakunowned之外,Apple 的Swift 編程語言指南還提到了捕獲說明符unowned(safe)unowned(unsafe)

我(認為我)理解weakunowned之間的區別; 但是unowned(safe)unowned(unsafe)之間有什么區別? 導游沒說。


請:不要僅僅依賴於聲明一個 Objective-C 的等價物。

據我了解,雖然我無法從 Apple 找到明確的來源,但unowned可以分為兩種, safeunsafe

unownedunowned(safe) :它是一個特殊包裝的引用,當引用釋放的實例時會拋出異常。

特殊情況是unowned(unsafe) :它是 Objective C 的@property (assign)__unsafe_unretained的 Swift 等價物。 它不應該在 Swift 程序中使用,因為它的目的是連接到用 Objective C 編寫的代碼。

因此,在查看 Cocoa 類的導入包裝器時,您會看到unowned(unsafe) ,但除非必須,否則不要使用它,並且您會知道何時必須使用。


更新

__unsafe_unretained是一個簡單的指針。 它不知道指向的實例何時被釋放,因此當它被取消引用時,底層內存可能是垃圾。

如果您有使用釋放的__unsafe_unretained變量的缺陷,您將看到不穩定的行為。 有時該內存位置足夠好,因此代碼可以運行,有時它會被部分覆蓋,因此您會遇到非常奇怪的崩潰,有時該內存位置將包含一個新對象,因此您將獲得無法識別的選擇器異常。

過渡到 ARC 發行說明

__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM