有趣的unowned(unsafe)

逛git時,看到一段代碼:源地址:https://gist.github.com/hoshi-takanori/07b2982c9942ebe186c530fa611921bb
<pre>
class Person {
let name: String
init(name: String) { self.name = name }
func printName() { print("name = (name)") }
deinit { print("(name) is being deinited") }
}

var p: Person? = Person(name: "Hoshi")
p?.printName() // name = Hoshi
unowned(unsafe) let q = p!
q.printName() // name = Hoshi
p = nil
//q.printName() // incorrect checksum for freed object - object was probably modified after being freed.
let pp = Person(name: "Takanori")
q.printName() // name = Takanori
</pre>
當q.printName()打印:name = Takanori ,我想多少人會WTF?!坝嬎銠C是不會干錯事的,只是我們沒有理解計算機的誠實?!?br> 但是到底為什么會有這樣的結果?
Swift內存管理有這么幾個部分:

  • strong
  • weak
  • unowned
    其中unowned分為unowned(safe)unowned(unsafe),默認情況下unowned是unowned(safe)
    當unowned(safe)引用的對象被dealloc之后,如果再次訪問這個對象,將會拋出一個異常來終止程序(訪問之前會進行檢查,如果所引用的對象已經被release,就拋出個異常,這也行就是safe的意思吧)
    但unowned(unsafe)不同,當unowned(unsafe)引用的對象被dealloc之后,如果再次訪問這個內存,會出現三種情況:(不會檢查,直接訪問,這也許就是unsafe的意思吧)
    1 內存沒有被改變點-->輸出原來的值
    2 內存被改變掉-->crash
    3 內存被同類型對象覆蓋-->不會crash,到使用的內存模型確實新對象的。

更深入的了解:http://stackoverflow.com/questions/26553924/what-is-the-difference-in-swift-between-unownedsafe-and-unownedunsafe

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容