15.1 Swift深浅拷贝
// 结构体 ,值类型的赋值操作是深拷贝 struct Deep { var copy: Int = 0 }
// 类,引用类型 的赋值操作是浅拷贝 class Shallow { var copy: Int = 0 }
/** 这就是深拷贝 ,但是是强引用 把d0完全复制给d1 d0 和 d1 是两个不同的对象。 内存地址不一样 */ var d0 = Deep.init() var d1 = d0
/** /Users/xiaoyulong/Desktop/swift/swiftLearn14/swiftLearn14/RootVC/RootViewController.swift:55:9: 'unsafeAddressOf' is unavailable: Removed in Swift 3. Use Unmanaged.passUnretained(x).toOpaque() instead. */ // unsafeAddressOf(d0 as AnyObject)
d1.copy = 9 print("d0.copy==(d0.copy)") print("d1.copy==(d1.copy)") /** d0.copy==0 d1.copy==9 d0.copy 和 d1.copy 不一样说明,他们两个就是不同的对象。说明是深拷贝 */
print("d0.Address==(Unmanaged<AnyObject>.passUnretained(d0 as AnyObject).toOpaque())")
print("d1.Address==(Unmanaged<AnyObject>.passUnretained(d1 as AnyObject).toOpaque())") /** d0.Address==0x0000600000055180 d1.Address==0x0000600000055330 */
print("--------------------->") /** 这就是浅拷贝 但是是强引用 */ var s0 = Shallow.init() var s1 = s0
s1.copy = 11 print("s0.copy==(s0.copy)") print("s1.copy==(s1.copy)") /** s0.copy==11 s1.copy==11 s0.copy 和 s1.copy 一样说明,他们两个就是同一个的对象。说明是浅拷贝 如果s1提前释放掉,s0不就变成野指针了吗?不用担心,有ARC引用机制啊。s0判断引用计数为0也会自动释放掉的。 */
print("s0.Address==(Unmanaged<AnyObject>.passUnretained(s0 as AnyObject).toOpaque())") print("s1.Address==(Unmanaged<AnyObject>.passUnretained(s1 as AnyObject).toOpaque())") /** s0.Address==0x0000600000421b20 s1.Address==0x0000600000421b20 */
/** 这些都是系统来替我们做的,程序员不需要做。 */ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |