-
非容器類對象
1 . imutable對象
NSString *string = @"origion";
NSString *stringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
[stringMCopy appendString:@"!!"];

變量地址
string和stringCopy指向同一段內(nèi)存,即淺拷貝。而mutableCopy內(nèi)存變化,為深拷貝
2 . mutable對象
NSMutableString *string = [NSMutableString stringWithString: @"origion"];
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
// [mStringCopy appendString:@"mm"];//error -----> A
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];

變量地址
string 和stringCopy和mStringCopy和stringMCopy四段內(nèi)存地址都不一樣,對于mStringCopy實(shí)際上是imutable對象,所以 A段代碼會報(bào)錯(cuò),因?yàn)樾薷牧薸mutable對象。所以對于 mutable對象(非容器類)copy和mutableCopy都是深拷貝,但是前者返回的對象imutable,不可修改
- 容器類對象
- imutable容器
NSArray *array = @[@"1",@"2",@"3"];
NSArray *arrayCopy = [array copy];
NSMutableArray *arrayMCopy = [array mutableCopy];
//[arrayMCopy addObject:@"4"];
//[arrayMCopy removeObjectAtIndex:0];
NSLog(@"obj address in array:%p at index 0 : %p",array, array[1]);
NSLog(@"obj address in arrayCopy:%p at index 0 : %p",arrayCopy, arrayCopy[1]);
NSLog(@"obj address in mArrayCopy:%p at index 0 : %p",arrayMCopy, arrayMCopy[1]);

變量地址
我們再看個(gè)例子
NSArray *array2 = @[[NSMutableString stringWithString:@"a"],
@"b",
@"c"];
NSArray *arrayCopy2 = [array2 copy];
NSMutableArray *arrayMCopy2 = [array2 mutableCopy];
NSLog(@"obj address in array2:%p at index 0 : %p",array2, array2[0]);
NSLog(@"obj address in arrayCopy2:%p at index 0 : %p",arrayCopy2, arrayCopy2[0]);
NSLog(@"obj address in arrayMCopy2:%p at index 0 : %p",arrayMCopy2, arrayMCopy2[0]);

變量地址
可見 對imutable對象進(jìn)行copy是指針復(fù)制,進(jìn)行mutableCopy是對象復(fù)制,但是容器內(nèi)容始終都是指針復(fù)制
2 . mutable容器
NSMutableArray *mArray3 = [NSMutableArray arrayWithArray:@[@"1",
@"2",
@"3"]];
NSArray *mArrayCopy3 = [mArray3 copy];
NSMutableArray *mArrayMCopy3 = [mArray3 mutableCopy];
NSLog(@"obj address in mArray3:%p at index 0 : %p",mArray3, mArray3[1]);
NSLog(@"obj address in mArrayCopy3:%p at index 0 : %p",mArrayCopy3, mArrayCopy3[1]);
NSLog(@"obj address in mArrayMCopy3:%p at index 0 : %p",mArrayMCopy3, mArrayMCopy3[1]);

變量地址
對于mutable容器,copy亦或是mutableCopy對于容器都是對象拷貝,對于容器內(nèi)容都是指針拷貝,并且copy返回imutable對象,mutableCopy返回mutable對象
總結(jié):
| copy | mutablecopy
----|------|----
不可變非容器對象 | 淺拷貝 | 深拷貝
可變非容器對象 | 深拷貝(返回不可變對象) | 深拷貝(返回可變對象)
不可變?nèi)萜鲗ο螅ㄈ萜鲀?nèi)容始終指針復(fù)制) | 淺拷貝(返回不可變對象) | 深拷貝(返回可變對象)
可變?nèi)萜鲗ο螅ㄈ萜鲀?nèi)容始終指針復(fù)制) | 深拷貝(返回不可變對象) | 深拷貝(返回可變對象)