OC对象复制:1-深复制与浅复制

一般来说,复制一个对象包括创建一个新的实例,并用原始对象中的值来初始化这个新的实例。复制非指针型的对象比较简单,例如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

再次运行后,运行结果如下。可以看到执行复制操作的对象和原始对象指向同一个内存地址,修改字符串的内容后,复制对象和原始对象的值相同。

你可能感兴趣的:(OC对象复制:1-深复制与浅复制)