copy和mutableCopy的区别

copy和mutableCopy的区别

深拷贝和浅拷贝的区别

在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝:并不拷贝对象本身,仅仅是拷贝指向目标对象的指针,并没有拷贝内容; 深拷贝:直接拷贝整个对象内容到另外一块内存中.
总结一句话: 浅拷贝就是拷贝指针,深拷贝就是拷贝内容

系统对象的copy和mutableCopy方法

1.copy方法用于拷贝对象的副本,通常来说copy方法总是返回对象的不可变的副本.即使原来的对象是可变的.例如[NSMutableString copy] 返回的依旧是 不可变 的字符串对象

2.mutableCopy方法用于拷贝对象的可变副本 .通常来说mutableCopy方法总是返回对象的可变副本.即使被拷贝的对象是不可变的.例如:[NSString mutableCopy]返回的是 可变字符串对象

NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary分别调用copy和mutableCopy总结

拷贝的副本对象类型:
copy -->不管原来的对象是什么类型 拷贝后返回的都是 不可变对象
mutableCopy -->不管原来的对象是什么类型,拷贝后返回的都是 可变对象

是否产生新的对象:
只有不可变对象的 copy方法,才不产生新的对象,其他的都会产生新对象

拷贝的类型区分:
不产生新对象的拷贝就是浅复制,其他都是深复制

自定义对象的拷贝

自定义对象要实现copy方法,需要实现NSCopying协议和实现CopyWithZone这个协议方法.不实现的话 会报 copy方法未实现的 错误
自定义对象拷贝代码实现:

    @interface CopyPerson : NSObject<NSCopying> //要实现NSCopying协议

    @property (nonatomic,copy) NSString *name;
    @property (nonatomic,copy) NSString *address;
    @property (nonatomic,assign)NSInteger age;
    @end

实现协议方法:

-(id)copyWithZone:(NSZone *)zone{
CopyPerson *person = [[[self class] allocWithZone:zone] init];
person.name = self.name;
person.age = self.age;
person.address = self.address;
return  person;
 }

使用copy:

CopyPerson *person = [[CopyPerson alloc] init];
person.name = @"xmg";
person.address = @"中国";
person.age = 24;

CopyPerson *newPerson = [person copy];

NSLog(@"newPerson.name = %@,newPerson.address = %@,newPerson.age = %ld ",newPerson.name,newPerson.address,newPerson.age); // xmg 中国 24
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容