您的位置:首页 > 移动开发 > Objective-C

Objective-C的对象复制

2019-06-09 09:13 1706 查看

copy 与mutableCopy方法

由 NSObject提供:在调用俩个方法时,他俩还会调用另俩个方法 copyWithZone 和 mutableCopyWithZone,后俩中方法返回复制的副本。后俩个方法的内容除名字外基本一致,所以前俩个方法是控制返回对象的一些特征。
copy返回的是不可修改的副本,即使原来的对象是可修改的
mutableCopy返回的可以修改的副本,即使原来的对象是不可修改的。

而俩者的复制均为浅复制。

之前在做软件协会的纳新题时,曾经有一道指针的题困扰过我,它问的大致意思是用指针修改内容会不会有隐患?
首先我们要明白,指针变量它存储的是一个地址

int *p ,q;
q = 2;
p = q;

好多人总是把最后一句话解读为把q赋值给p,其实是错误的,p是一个指针变量,它只能存地址,我们一般说p指向q,为什么这样说,因为p里放的q的地址,那么它就是指向q的,你心血来潮想修改p的值,p = 3;因为p和q的地址是一样的,这样做,是把这个地址所代表的值换成了3,所以q和p此时都是3.
而copyWithZone 和 mutableCopyWithZone里都是浅复制,他们返回的都是可修改的副本, copy 与mutableCopy方法里还有另外一个协议,NSCopying和NSMutableCopying,遵守这个协议才返回可修改和不可修改的对象。

- (id)copyWithZone : (NSZone *)zone {
- NSLog(@"执行copyWithZone:--");
- FKDog * dog = [[self class] allocWithZone : zone] init];
- dog.name = [self.name mutableCopy];
- dog.age = self.age;
- return dog;
- }

先将原对象的name属性复制了一份可变副本,然后将这个可变副本赋值给新对象,实现了深复制的copyWithZone。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: