关于Java和OC深浅复制的问题

昨天做项目的时候才发现Java和OC的深浅复制和Java的完全相反,Java的深复制是复制对象的地址,即两个对象有相同的内存地址(或者说这是同一个对象),而浅复制才是复制是一个新的对象,即新开辟一个新的内存地址,属性通过赋值传递。

下面是Java的一个例子:

public class Main {

    public static void main(String[] args) throws CloneNotSupportedException {
        Cat cat = new Cat();
        cat.setName("猫");
        //深复制
        Cat cat1 = cat;
        //浅复制
        Cat cat2 = (Cat) cat.clone();
        System.out.println("原对象cat的地址:" + cat);
        System.out.println("深复制cat1的地址:" + cat1);
        System.out.println("浅复制cat2的地址:" + cat2);
    }
}

class Cat implements Cloneable {

    private String name;

    public Cat() {

    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

而OC的深浅复制(OC通常称为拷贝)和Java正好相反:
- 浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。
- 深拷贝是指拷贝对象的具体内容,而内存地址是自主分配的,拷贝结束之后,两个对象虽然存的值是相同的,但是内存地址不一样,两个对象也互不影响,互不干涉。

OC中关键字retaincopymutableCopy的区别
retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。
copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,
引用计数每次加一。始终返回一个不可变对象。
mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

下面是OC的例子:

NSString* string = @"源字符串";  
NSString* stringCopy = [string copy];// stringCopy与string地址相同,retainCount+ 1  
NSMutableString* stringMCopy = [string mutablecopy];// stringMCopy与string地址不同  

NSMutableString* stringM1 = [stringMCopy copy];//地址与stringMCopy不同,且为不可修改
NSMutableString* stringM2 = [stringMCopy mutablecopy];//地址与stringMCopy不同,可修改 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值