// 结构体 ,值类型的赋值操作是深拷贝
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
*/
/**
这些都是系统来替我们做的,程序员不需要做。
*/
原文链接:https://www.f2er.com/swift/322361.html