逛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,到使用的內存模型確實新對象的。