copy 是深拷贝还是浅拷贝
答案:2 悬赏:50 手机版
解决时间 2021-04-01 16:49
- 提问者网友:浪荡绅士
- 2021-04-01 09:06
copy 是深拷贝还是浅拷贝
最佳答案
- 五星知识达人网友:野味小生
- 2021-04-01 10:38
copy是深拷贝还是浅拷贝要看是可变与不可变。不可变是深拷贝,可变是浅拷贝。
非容器类:
因为是不可变的对象,所以当copy的时候,只是指针的复制,而内容未复制,所以在原来的不可变的对象的引用计数+1,如果先release,然后改变不可变对象的值,从而改变了它的指针地址,而对于拷贝的对象并未发生改变;
如果先改变不可变对象的值,结果同上。对于mutableCopy,此重新创建了一个内存地址,所以不改变,为深拷贝。
对于可变的对象,当copy的时候,至少指针复制,而复制给的对象应该在内存中创建一个空间。所以,指针地址改变了,所以是浅拷贝,即使使用的时可变的拷贝也是浅拷贝。
如果在原来的可变的对象中再次加入内容,那么还是其余的copy和mutableCopy还是不会变,因为他们已经是不同的内存地址了。
容器类:
1.
对于不可变对象,在copy中,此时的和非容器类的不可变对象相同,同样是浅拷贝,但是因为此时的指针都是指向容器,所以当容器里边的值
发生改变的时候,copy的对象也会发生改变,即使对于Copy的对象的容器内容发生重新定义也不会改变,只会根据原来不可变对象的内容改变而改变,而对
于mutableCopy,因为是深拷贝,所以也会改变但是其内存地址在Copy中重新创建了一个空间。所以对于Copy和mutableCopy,他们
容器内的值地址并非发生改变;而对于容器发生改变的时候将和非容器不可变对象的结果一模一样,mutableCopy还是深拷贝,不会发生改变。
非容器类:
因为是不可变的对象,所以当copy的时候,只是指针的复制,而内容未复制,所以在原来的不可变的对象的引用计数+1,如果先release,然后改变不可变对象的值,从而改变了它的指针地址,而对于拷贝的对象并未发生改变;
如果先改变不可变对象的值,结果同上。对于mutableCopy,此重新创建了一个内存地址,所以不改变,为深拷贝。
对于可变的对象,当copy的时候,至少指针复制,而复制给的对象应该在内存中创建一个空间。所以,指针地址改变了,所以是浅拷贝,即使使用的时可变的拷贝也是浅拷贝。
如果在原来的可变的对象中再次加入内容,那么还是其余的copy和mutableCopy还是不会变,因为他们已经是不同的内存地址了。
容器类:
1.
对于不可变对象,在copy中,此时的和非容器类的不可变对象相同,同样是浅拷贝,但是因为此时的指针都是指向容器,所以当容器里边的值
发生改变的时候,copy的对象也会发生改变,即使对于Copy的对象的容器内容发生重新定义也不会改变,只会根据原来不可变对象的内容改变而改变,而对
于mutableCopy,因为是深拷贝,所以也会改变但是其内存地址在Copy中重新创建了一个空间。所以对于Copy和mutableCopy,他们
容器内的值地址并非发生改变;而对于容器发生改变的时候将和非容器不可变对象的结果一模一样,mutableCopy还是深拷贝,不会发生改变。
全部回答
- 1楼网友:不如潦草
- 2021-04-01 10:48
copy 缺省是浅拷贝.但是 copy 也可以做成深拷贝
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯