NSArray *arr = [NSArray arrayWithObjects:@"1",@"2",@"3", nil];
NSMutableArray *arr1 = [arr copy];//浅拷贝 ->不可变数组
NSMutableArray *arr2 = [arr mutableCopy];//深拷贝 ->可变数组
[arr2 addObject:@"四"];
NSMutableArray *muarr = [NSMutableArray arrayWithObjects:@"一",@"二",@"三", nil];\
/*
<__NSArrayM 0x600003ae54d0>(
*/
NSMutableArray *muarr1 = [muarr copy];//深拷贝 ->不可变数组
/*
<__NSArrayI 0x600003ae5470>(
)
*/
NSMutableArray *muarr2 = [muarr mutableCopy];//深拷贝 ->可变数组
/*
<__NSArrayI 0x600003ae4f00>(
*/
[muarr2 addObject:@"四"];
NSLog(@"");
NSLog(@"");
NSLog(@"");
总结:只有NSArray的copy是浅拷贝,其他都是深拷贝,copy出来的都是不可变对象,mutable拷贝出来的都是可变对象
NSString *str = @"123";
NSMutableString *str1 = str.copy;//浅拷贝 ->不可变字符串
NSMutableString *str2 = str.mutableCopy;//深拷贝 ->可变字符串
[str2 appendString:@"--"];
NSMutableString *mStr = [NSMutableString stringWithString:@"abc"];
NSMutableString *mStr1 = [mStr copy];//深拷贝->不可变字符串
//[mStr1 appendString:@"2"];崩溃
NSMutableString *mStr2 = [mStr mutableCopy];//深拷贝->可变字符串
[mStr2 appendString:@"3"];
NSLog(@"==");
总结:只有NSString的copy是浅拷贝,其他都是深拷贝,copy出来的都是不可变对象,mutable拷贝出来的都是可变对象
//数组元素的拷贝
NSMutableArray *muaArr = [NSMutableArray array];
for (int i = 0; i < 3; i++)
{
Person *p = [[Person alloc]init];
p.name = @"test";
[muaArr addObject:p];
// NSString *str = @"test";
// NSMutableString *muaStr = [NSMutableString stringWithString:str];
// [muaArr addObject:muaStr];
}
NSMutableArray *muaArr1 = [muaArr copy];//数组元素str浅拷贝
NSMutableArray *muaArr2 = [muaArr mutableCopy];//数组元素str浅拷贝
NSMutableArray *muaArr3 = [[NSMutableArray alloc]initWithArray:muaArr copyItems:YES];//数组元素str 深拷贝
NSLog(@"数组的元素的拷贝");
#import "Person.h"
@implementation Person
-(id)copyWithZone:(NSZone *)zone
{
Person *person = [[self class]allocWithZone:zone];
person.name = [_name copy];
return person;
}
@end
自定义对象要自己实现NSCoping、NSMutableCopying
协议