逛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。“计算机是不会干错事的,只是我们没有理解计算机的诚实。”
但是到底为什么会有这样的结果?
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,到使用的内存模型确实新对象的。