/**
-
一.系統非容器類對象
1.對不可變對象復制:copy是指針復制、mutableCopy是對象復制
2.可變對象復制:copy和mutableCopy都是對象復制,但是copy返回的對象是不可變的
3.copy返回的是不可變的對象、mutableCopy返回的是可變的對象
*/
-
(void)NoContainerClassObjectCopyAndMutableCopyDifference {
NSString *str = @"origion";
NSString *strCopy = [str copy];
NSLog(@"str=%p\nstrCopy=%p",str,strCopy);
// str=0x100d452b8 strCopy=0x100d452b8
// 結論:兩個的地址是一樣的,也就是str和strCopy指向的是同一塊內存區域NSMutableString *strMCopy = [str mutableCopy];
[strMCopy stringByAppendingString:@"mutableCopy添加"];
NSLog(@"str=%p\nstrCopy=%p",str,strMCopy);
// str=0x100d452b8 strCopy=0x60800027a940
// 結論:兩個是不一樣的地址,也就是說mutableCopy是真正意義上的復制,系統為其分配了新的內存
NSMutableString *mStr = [NSMutableString stringWithString:@"可變字符串"];
NSMutableString *mStrCopy = [mStr copy];
NSMutableString *mStrMCopy = [mStr mutableCopy];
NSLog(@"\nmStr=%p\nmStrCopy=%p\nmStrMCopy=%p",mStr,mStrCopy,mStrMCopy);
[mStrMCopy appendString:@"拼接的mutableCopy"];
// [mStrCopy appendString:@"拼接的copy"]; // 此方法會崩潰。因為copy成的是不可變的字符串
NSLog(@"mStrCopy=%@mStrMCopy=%@",mStrCopy,mStrMCopy);
// 結論:三者的地址是不一樣的,但是copy復制的返回的是不可變的對象
}
/**
-
二、系統的容器類對象
結論同系統的非容器類對象一樣
*/
- (void)containerClassObjectCopyAndMutableCopyDifference {
//copy返回不可變對象,mutablecopy返回可變對象
NSArray *array = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
NSArray *arrayCopy = [array copy];
NSArray *arrayMCopy = [array mutableCopy];
NSLog(@"\narray=%p\narrayCopy=%p\narrayMCopy=%p",array,arrayCopy,arrayMCopy);
// 結論:array和arrayCopy的地址是一樣的,array和arrayMCopy的地址是不一樣的
// 則對于不可變對象的copy是指針復制,mutableCopy是對象復制
NSMutableArray *mArray = [@[@"sd",@"sdf"] mutableCopy];
NSMutableArray *marrayCopy = [mArray copy];
NSMutableArray *marrayMCopy = [mArray mutableCopy];
NSLog(@"\nmArray=%p\nmarrayCopy=%p\nmarrayMCopy=%p",mArray,marrayCopy,marrayMCopy);
// 結論:mArray、marrayCopy、marrayMCopy的地址都不一樣,也就是說copy和mutableCopy都是對象復制
[marrayMCopy addObject:@"啦啦啦"];
[marrayCopy addObject:@"哈哈"]; // 會崩潰。copy返回的是不可變的
}