说明
浅拷贝
浅拷贝只进行对象地址的拷贝,效率高,但是一旦person1操作了Person对象,person2指向的对象空间也会发生内容上的改变。
深拷贝
深拷贝,直接去内存中开辟一个新的对象空间的地址,然后把原先要拷贝的对象内容全部搬到副本空间里面来,也就是创建一个对象的副本实体。效率低,但是Person1和Person2操作的是2个不同的内存空间,所以Person1对对象的操作,不会影响到Person2的对象内存空间的。
使用
copy不可变拷贝
返回的对象一定是不可变的。
NSString *[email protected]"string";
NSLog(@"string:%p",string);
NSString *string2=[string copy];
NSLog(@"string2:%p",string2);
输出:string和string2,的地址是一样的。当copy拷贝的是一个不可变对象的时候,copy方法进行的是浅拷贝操作
NSMutableString *mutableString=[NSMutableString stringWithString:string];
NSLog(@"mutableString:%p",mutableString);
NSString *string3=[mutableString copy];
NSLog(@"string3:%p",string3);
输出:两次的地址不同
copy是不可变拷贝,如果拷贝了可变对象,只有执行深拷贝才能完成。
mutableCopy可变拷贝
无论拷贝的对象是可变的还是不可变的,都会进行深拷贝,而且拷贝出来的空间一定是可变的。
NSMutableString *mutableStringCopy=[string mutableCopy];
NSLog(@"mutableStringCopy:%p",mutableStringCopy);
输出:string和mutableStringCopy的地址不一样。执行的是深拷贝。
NSMutableString *mutableStringCopy=[mutableString mutableCopy];
NSLog(@"mutableStringCopy:%p",mutableStringCopy);
输出:mutableString和mutableStringCopy地址不一样,执行的也是深拷贝。