对可变容器类型对象和不可变容器类型对象.array, mutableArray,dictionary,mutableDictionary.分别copy和mutableCopy时,有什么区别.
像这种死的东西, 写段代码,测试一下就真相大白了
NSString* string = [NSString stringWithFormat:@"sfgasfasgfasgsdgfseg"];
NSLog(@"string 的地址是:%p",string);
NSArray* array = [NSArray arrayWithObjects:string, nil];
NSLog(@"array的地址是:%p, 第一个元素的地址是:%p",array,array[0]);//从输出结果我们可以知道,数组中存放的就是元素的地址.
NSMutableArray* mutableArray = [NSMutableArray arrayWithObjects:string, nil];
NSLog(@"mutableArray的地址是:%p, 第一个元素的地址是:%p",mutableArray,mutableArray[0]);
//不变数组的深浅拷贝
NSArray* copyArray = [array copy];
//浅拷贝
NSLog(@"copyArray 的地址是:%p",copyArray);
//深拷贝
NSArray* mutableCopyArray = [array mutableCopy];
NSLog(@"mutableCopyArray 的地址是:%p",mutableCopyArray);
//可变数组的深浅拷贝
//浅拷贝
NSMutableArray* copyMutableArray = [mutableArray copy];
// [copyMutableArray addObject:@"崩!"];//代码会崩.
NSLog(@"copyMutableArray 的地址是:%p, 第一个元素的地址是:%p",copyMutableArray,copyMutableArray[0]);
//深拷贝
NSMutableArray* mutableCopyMutableArray = [mutableArray mutableCopy];
[mutableCopyMutableArray addObject:@"我不会崩"];
NSLog(@"mutableCopyMutableArray 的地址是:%p, 第一个元素的地址是:%p",mutableCopyMutableArray,mutableCopyMutableArray[0]);
/*****那么数组的深浅拷贝又有什么区别呢?*****/
//答:对copy来的可变对象,执行增,删操作. 会崩,因为执行copy操作,得到的是对象副本是不可变的.
/** array不用copy修饰可以吗?*/
//像这样:
NSArray* testArray = mutableArray;
[mutableArray addObject:@"add"];
NSLog(@"testArray 的地址是:%p,内容是:%@",testArray,testArray);//这就出问题了. 出现了我们不想要的结果.我们的不可变数组,如今的内容却改变了.
看完代码,相信会解决你的疑惑. 不想看直接看下面结论! 不过还是希望你看看代码.
结论:
- 容器类型对象存放的都是其元素的地址.
- copy和mutableCopy在针对可变容器类型的对象和不可变容器类型对象的执行结果是不一样的.针对不可变容器类型,copy是浅复制.只复制对象的地址,存放副本.而可变容器类型,则会新开辟一块内存.
- 对于mutableCopy,针对可变容器类型和不可变容器类型,都是在内存中开辟一块内存,存放副本.所谓:深复制,其实也不深,复制的内容都还是其元素的地址.
- 使用copy得到的内存是不可变的(对象不可变),mutableCopy是可变的(内存可变). so不可以mutableCopy一个mutableArray.当添加元素的时候,会崩!
- 不可以使用strong修饰array. 其他不可变容器类型也一样. 以防其子类可变容器类型的对象,间接改变对象.