15.1 Swift深浅拷贝

本文通过Swift代码示例对比了结构体(值类型)的深拷贝与类(引用类型)的浅拷贝行为。演示了当一个对象被赋值给另一个对象时,如何区分两者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        //结构体,值类型的赋值操作是深拷贝
        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(d0as AnyObject).toOpaque())")
        
        print("d1.Address==\(Unmanaged<AnyObject>.passUnretained(d1as 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(s0as AnyObject).toOpaque())")
        print("s1.Address==\(Unmanaged<AnyObject>.passUnretained(s1as AnyObject).toOpaque())")

        /**
         s0.Address==0x0000600000421b20
         s1.Address==0x0000600000421b20
         */
        
        /**
          这些都是系统来替我们做的,程序员不需要做。
         */


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值