一般来说,复制一个对象包括创建一个新的实例,并用原始对象中的值来初始化这个新的实例。复制非指针型的对象比较简单,例如int,float,BOOL等。复制指针型的对象有浅复制和深复制两种方法。
1、深复制与浅复制的简介
针对指针型对象的拷贝,有浅复制和深复制两种。
浅复制:将原始对象的指针值复制到副本中,即指针拷贝,原始对象和副本共享引用的数据;相当于创建了一个文件的快捷方式。
深复制:复制原始对象指针所引用的数据,并将其赋给副本对象,即内容拷贝,相当于创建了一份新的文件。
例如,当我们为一个类的属性添加copy关键字时,那么对这个属性赋值时(即:调用setter方法),就会执行深拷贝操作。当我们把属性关键字改为strong或者weak时,那么对这个属性赋值时,就会执行浅拷贝(只拷贝指针地址)。
2、示例代码
新增一个ClassA类,并添加一个NSString类型的name属性,并添加copy关键字。另外,NSString类已经遵守了NSCopying协议。
#import
@interfaceClassA:NSObject
@property(nonatomic,copy)NSString*name;
@end
在main.m文件中添加如下函数,并调用;
voidcopyTest(){
NSMutableString*string=[[NSMutableStringalloc]initWithFormat:@"www.hcios.com"];
ClassA*classA=[[ClassAalloc]init];
classA.name=string;
[stringappendString:@"+"];
NSLog(@"string : %@ address: %p",string,string);
NSLog(@"copy Property : %@ address: %p",classA.name,classA.name);
}
运行结果如下,可以看到内存地址不同,并且指向不同的字符串。
接下来,修改属性关键字为strong,如下:
#import
@interfaceClassA:NSObject
@property(nonatomic,strong)NSString*name;
@end
再次运行后,运行结果如下。可以看到执行复制操作的对象和原始对象指向同一个内存地址,修改字符串的内容后,复制对象和原始对象的值相同。