注册 登录
主题 : 关于OC的深拷贝,进来PK一下。
级别: 精灵王
UID: 164303
精华: 0
发帖: 3023
可可豆: 3353 CB
威望: 3331 点
在线时间: 4730(时)
注册时间: 2012-09-02
最后登录: 2017-10-15
0 楼:  发表于: 2017-02-21 21:38    发自: Web Page
来源于 一般提问 分类

关于OC的深拷贝,进来PK一下。   

管理提醒: 本帖被 阿花君霸占路人 执行提前操作(2017-02-22)
最近简书上经常和别人就这个问题进行一些PK,其实观点上是一致的,但就这个“深拷贝”名词上说不到一块儿上去,即使我“努力”解析也无法达到共识,这真的有这么难吗?


先说说C的赋值语句。
int a = 10;
int b = a;


这实质上是一次值拷贝过程,改变b的值并不会让a同时改变。大概也很多人没有意识到这也是一种拷贝行为。


然后说说指针
int a = 10;
int *pa = &a;
int *pb = pa;


第二第三行也是拷贝行为,但第二种属于浅拷贝。深浅拷贝在C中是用来描述指针拷贝行为的,除非手动实现否指针的赋值行为是属于浅拷贝。


但OC广义来说就不要用上面那套了,因为很容易让人误解。
例如我和别人争论的中心在于我的观点是,Foundation主要的类型只有浅拷贝,没有深拷贝。例如NSArray,NSMutableArray等。。。
对方反驳的是 不可变对象进行mutableCopy和可变对象进行copy/mutableCopy就是深拷贝。
原因就是上面说的指针问题。
但众所周知的是,对Foundation的不可变对象进行Copy,实际上只是对该对象进行retainCount + 1然后返回该对象的地址,ARC里实际上连retainCount都没给你加。。尤其是对于字符串常量。因为是没有必要的,本身对象不可变,你要一个副本也无法修改,失去了拷贝的意义。下面里有没有copy都是一样的,属于没意义的。。。所以他们只是只是指针复制了。
NSString *s = @"abc";
NSString *t = s.copy;


而争论在这里展开了,对方认为下面这个行为属于深拷贝。我则不认为。原因在于我对拷贝的认知是两者完全一模一样,包括它们的类型,状态。但下面两个类是一样的吗?明显不是,或不完全是。它是先拷贝然后对原来的对象进行了修改,属于两个动作。
NSString *s = @"abc";
NSMutableString *t = s.mutableCopy;


再说回来关于NSArray,对其进行mutableCopy和上面的字符串一样,拷贝出来的不是相同的东西,类型也变了。但明显的它指向的是和原本的对象是一致的这种内容没有被拷贝,只是容器拷贝的行为凭什么被叫做深拷贝?而连容器内对象都进行拷贝的行为,有些人叫做“完全拷贝”。。。也的确够完全的。


实质上。。。争论这个也没有什么实质上的意义。只是争论过程中顺便理清了所谓拷贝的本质而已。





——————————————————————————————————————————————————————————————————————
这论坛没死了,第一次发出帖子。。。飞出了地球。第二次完整拷贝后居然就能发出了。。。。。。。真想问候人下运营方的家属。

再吐槽一下,作为一个苹果开发社区,在iOS的safari上打开论坛居然无法翻页,这个是不是很搞笑?即使在Mac上的Safari浏览也各种奇葩问题,也很搞笑是不是?

级别: 版主

状态: 连续签到 - [7天]
UID: 123750
精华: 2
发帖: 2122
可可豆: 3539 CB
威望: 3460 点
在线时间: 1632(时)
注册时间: 2012-02-15
最后登录: 2017-12-15
1 楼:  发表于: 2017-02-21 21:59    发自: Web Page
进来看大佬讲课
<null>
级别: 骑士
UID: 206719
精华: 0
发帖: 365
可可豆: 734 CB
威望: 719 点
在线时间: 335(时)
注册时间: 2013-01-23
最后登录: 2017-05-20
2 楼:  发表于: 2017-02-21 22:29    发自: Web Page
回 楼主(noah1985) 的帖子
app也没个正经的。。。
级别: 骑士
状态: 连续签到 - [191天]
UID: 531892
精华: 0
发帖: 322
可可豆: 1388 CB
威望: 950 点
在线时间: 1070(时)
注册时间: 2015-12-16
最后登录: 2017-12-15
3 楼:  发表于: 2017-02-22 08:35    发自: Web Page
进来跟大佬学习
级别: 版主

状态: 连续签到 - [67天]
UID: 550118
精华: 1
发帖: 1759
可可豆: 2835 CB
威望: 2718 点
在线时间: 939(时)
注册时间: 2016-03-14
最后登录: 2017-12-15
4 楼:  发表于: 2017-02-22 08:36    发自: Web Page
进来看大佬讲课
级别: 骑士

状态: 连续签到 - [87天]
UID: 371193
精华: 0
发帖: 269
可可豆: 944 CB
威望: 747 点
在线时间: 519(时)
注册时间: 2014-09-08
最后登录: 2017-12-13
5 楼:  发表于: 2017-02-22 08:42    发自: Web Page
我记得论坛以前也有个帖子说浅拷贝和深拷贝问题的,说的很对,很多人在这个问题上都存在误区,主要现在网络上很多发表文章的自己认识的都是错的
级别: 新手上路
UID: 604908
精华: 0
发帖: 71
可可豆: 89 CB
威望: 89 点
在线时间: 30(时)
注册时间: 2017-02-09
最后登录: 2017-03-09
6 楼:  发表于: 2017-02-22 08:44    发自: Web Page
回 4楼(zuyu) 的帖子
早啊
级别: 侠客
状态: 连续签到 - [3天]
UID: 489219
精华: 0
发帖: 155
可可豆: 199 CB
威望: 203 点
在线时间: 788(时)
注册时间: 2015-07-15
最后登录: 2017-12-16
7 楼:  发表于: 2017-02-22 08:52    发自: Web Page
他妈的 刚去温习了一下 发现有些地方理解错了。听大佬讲课。
级别: 圣骑士
状态: 连续签到 - [35天]
UID: 518463
精华: 0
发帖: 439
可可豆: 936 CB
威望: 853 点
在线时间: 647(时)
注册时间: 2015-10-28
最后登录: 2017-08-09
8 楼:  发表于: 2017-02-22 08:52    发自: Web Page
昨晚的课,早上才来听了。
级别: 侠客
状态: 连续签到 - [54天]
UID: 577998
精华: 0
发帖: 171
可可豆: 447 CB
威望: 358 点
在线时间: 621(时)
注册时间: 2016-08-15
最后登录: 2017-12-15
9 楼:  发表于: 2017-02-22 08:52    发自: Web Page
    完了,成功的又把关于深浅拷贝的东西给弄迷糊了。。
描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部