先写一下理论,然后写具体的实现。
复制对象:将一个已有的对象复制一份出来,开辟一块新的内存(堆内存)来存储对象,相当于一个对象副本,就像复制文件一样。源对象和对象副本是两块不同的内存区域。对象复制又分为浅拷贝和深拷贝。
Foundation框架支持复制对象的有:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,
NSNumber。也可以自定义对象来支持复制,前提是必须遵守NSCopying协议,或是NSMutableCopying协议,或是两者都必须遵守。
copy方法用于复制对象的不可变副本。通常来说,copy方法总是返回对象的不可修改的副本,即使该对象本身是可修改的。例如:程序调用了NSMutableString的copy方法,将会返回不可修改的字符串对象。
mutableCopy方法用于复制对象的可变副本。通常来说,mutableCopy方法总是返回对象的可修改的副本,即使该对象本身是不可修改的。例如:程序调用了NSString的mutableCopy方法,将会返回可修改的字符串对象。
提到copy就必须说一下retain,retain是指针拷贝,而copy是对象拷贝。
retain只是引用计数+1,两个指针指向同一个内存。
copy是开辟出一个内存,两个指针指向两块内存。
浅拷贝:只拷贝对象本身,对象里面所包含的属性或者对象不进行拷贝。
深拷贝:除了拷贝对象本身之外,对象里面所包含的属性或对象都一起拷贝,直到两个对象没有任何的共用部分。
// 下面用代码实现一下自定义对象的copy
#import <Foundation/Foundation.h>
@interface CopyDto :NSObject <NSCopying>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *age;
@end
#import "CopyDto.h"
@implementation CopyDto
- (id)copyWithZone:(NSZone *)zone {
CopyDto *dto = [[[selfclass]allocWithZone:zone]init];
dto.name =self.name;
dto.age =self.age;
return dto;
}
@end
CopyDto *dto1 = [CopyDto alloc] init];
dto1.name = @"笨笨";
dto1.age = @"12";
CopyDto *dto2 = [dto1 copy];
这样就完成了一次自定义对象的copy。 dto1和dto2内存不同,这是属于深拷贝,两个对象没有任何的公共部分,改变dto2的值,dto1不会跟着改变。