非容器类对象
[plain] view plaincopy
- // 非容器类对象
- NSString *str = @\"Chen_Yilong\";
- NSString *strCopy = [str copy];
- NSMutableString *mstrCopy = [str mutableCopy];
- [mstrCopy appendString:@\"的优快云博客专栏\"];
- NSLog(@\"%@\",mstrCopy);
- NSLog(@\"%@\",str);
- NSLog(@\"%@\",strCopy);

[plain] view plaincopy
- NSMutableString *mstr = [NSMutableString stringWithString:@\"Chen_Yilong\"];
- NSString *strCopy = [mstr copy];
- NSMutableString *mstrCopy = [mstr copy];
- NSMutableString *mstrMCopy = [mstr mutableCopy];
- //[mstrCopy appendString:@\"的优快云专栏\"]; //error
- [mstr appendString:@\"的新浪微博\"];
- [mstrMCopy appendString:@\"的新浪微博帐号为:南阳理工微博校园\"];
- NSLog(strCopy);
- NSLog(mstr);
- NSLog(mstrCopy);
- NSLog(mstrMCopy);

- 如果对一个不可变对象复制,copy是指针复制,即浅拷贝;而mutableCopy则是对象复制,即深拷贝。(示例1)
- 如果是对可变对象复制,都是深拷贝,但copy复制返回的对象是不可变的。(示例2)
-
-
- 如下图所示:对于非容器类:
- (1)一般情况下, copy复制一个不可变对象,而mutableCopy复制一个mutable可变对象。copy不可变浅复制,mutableCopy可变深复制;
- 特殊情况下:
- (A)可变对象的 Copy:复制:(a)副本不可变(欲求证,可见前面的示例2)(b)深复制
- (B)不可变对象的mutableCopy:复制:(a)副本可变 (b)深复制
- 由(1)(2)可知这两种特殊情况都是深复制;
- 研究一下(B):用mutableCopy:复制不可变对象,由(3)可知:得到的副本一定是可变,所以可知道这种复制一定不是指针复制,为深层复制,否则依然不可变.
-
- (2)可变对象不管怎么复制都是深复制,且副本不一定可变(图片第二列);
- (3)用mutableCopy:复制的副本可变,且都是深复制(图片第三行);
- (4)用 Copy:复制的副本不可变,不一定是浅复制;(图片第二行)
- (5)副本不可变,不一定就是浅复制(如:可变-Copy,唯一副本不可变的深复制);副本可变,一定是深复制(图片第三行)
- 于是知道:
- 可变不可变,看复制方法是mutablCopy:或Copy:;
- 深或浅,看对象可变还是不可变;
容器类对象深浅复制
比如NSArray,NSDictionary等。对于容器类本身,上面讨论的结论也适用的,下面探讨的是复制后容器内对象的变化。
[plain] view plaincopy
- NSArray *array1 = [NSArray arrayWithObjects:@\"Chen\",@\"Chen_Yi\",@\"long\",nil];
- NSArray *arrayCopy1 = [array1 copy];
- //arrayCopy1是和array同一个NSArray对象(指向相同的对象),包括array里面的元素也是指向相同的指针
- NSLog(@\"array1 retain count: %d\",[array1 retainCount]);
- NSLog(@\"array1 retain count: %d\",[arrayCopy1 retainCount]);
- NSMutableArray *mArrayCopy1 = [array1 mutableCopy];
- //mArrayCopy1是array1的可变副本,指向的对象和array1不同,但是其中的元素和array1中的元素指向的还是同一个对象。mArrayCopy1还可以修改自己的对象
- [mArrayCopy1 addObject:@\"的新浪微博是:南阳理工微博校园\"];
- [mArrayCopy1 removeObjectAtIndex:0];
- int count=[mArrayCopy1 count];
- int i;
- for(i=0;i<count;i++)
- {
- printf(\"%i: %s \",i,[[mArrayCopy1 objectAtIndex:i] UTF8String]);
- }

array1和arrayCopy1是指针复制,而mArrayCopy1是对象复制,符合前面示例1讨论的结论。mArrayCopy1可以改变其内的元素:删除或添加。但容器内的元素内容都是浅拷贝。
[plain] view plaincopy
- NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@\"Chen_Yilong\"],@\"Chen\",@\"_Yilong\",nil];
- NSLog(@\"mArray1 retain count: %d\",[mArray1 retainCount]);
- NSArray *mArrayCopy2 = [mArray1 copy];
- NSLog(@\"mArray1 retain count: %d\",[mArray1 retainCount]);
- // mArray1和mArrayCopy2指向同一对象,retain值+1。
- NSMutableArray *mArrayMCopy1 = [mArray1 mutableCopy];
- NSLog(@\"mArray1 retain count: %d\",[mArray1 retainCount]);
- //mArrayCopy2和mArray1指向的是不一样的对象,但是其中的元素都是一样的对象——同一个指针
- NSMutableString *testString = [mArray1 objectAtIndex:0];
- //testString = @\"Chen_Yilong\";//这样会改变testString的指针,其实是将@“Chen_Yilong”临时对象赋给了testString
- [testString appendString:@\" 的新浪微博是:南阳理工微博校园\"];//这样以上三个数组的首元素都被改变了
- NSLog(@\"%@\",testString);
- NSLog(@\"%@\",[mArray1 objectAtIndex:0]);
- NSLog(@\"%@\",[mArrayCopy2 objectAtIndex:0]);
- NSLog(@\"%@\",[mArrayMCopy1 objectAtIndex:0]);
[plain] view plaincopy
- NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithString:@\"first\"],[NSString stringWithString:@\"b\"],@\"c\",nil];
- NSArray *deepCopyArray=[[NSArray alloc] initWithArray: array copyItems: YES];
- NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:
- [NSKeyedArchiver archivedDataWithRootObject: array]];
[plain] view plaincopy
- NSString *str = @\"Chen_Yilong\";