深拷貝:內(nèi)容拷貝败砂,拷貝出來的對象和之前的對象的地址不一樣。
淺拷貝:指針拷貝徊件,拷貝出來的對象和之前的對象的地址一樣梭依。
1.對可變對象進(jìn)行copy操作
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *mStr = [NSMutableString stringWithString:@"mStr"];
NSString *copyStr = [mStr copy];
[mStr appendString:@"123"];
// mStr:0x60800007f440 - copyStr:0xa0000007274536d4
NSLog(@"mStr:%p - copyStr:%p",mStr, copyStr);
}
結(jié)論:1.對可變對象 進(jìn)行 copy 操作是內(nèi)容拷貝(深拷貝)
2. copy 出來的copyStr是NSString類型的,如果對copyStr調(diào)用
NSMutableString的方法appendString是會崩潰的鸣奔。
2.對可變對象進(jìn)行mutableCopy操作
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *mStr = [NSMutableString stringWithString:@"mStr"];
NSMutableString *mutableCopyStr = ?[mStr mutableCopy];
// str:0x608000260140 - mutableCopyStr:0x608000260440
NSLog(@"str:%p - mutableCopyStr:%p",mStr, mutableCopyStr);
}
結(jié)論:1.對可變對象 進(jìn)行 mutableCopy 操作是內(nèi)容拷貝(深拷貝)
2. mutableCopy 出來的mutableCopyStr是 NSMutableString 類型
3.對不可變對象進(jìn)行copy操作
- (void)viewDidLoad {
[super viewDidLoad];
NSString *Str = [NSString stringWithFormat:@"Str"];
NSString *copyStr = [Str copy];
// str:0x10147e128 - copyStr:0x10147e128
NSLog(@"str:%p - copyStr:%p",Str, copyStr);
}
結(jié)論:對不可變對象 進(jìn)行 copy 操作是指針拷貝(淺拷貝)
4.對不可變對象進(jìn)行mutableCopy操作
- (void)viewDidLoad {
[super viewDidLoad];
NSString *mStr = [NSString stringWithFormat:@"mStr"];
NSMutableString *mutableCopyStr = [mStr mutableCopy];
// str:0xa0000007274536d4 - mutableCopyStr:0x60800026a680
NSLog(@"str:%p - mutableCopyStr:%p",mStr, mutableCopyStr);
}
結(jié)論:1.對不可變對象 進(jìn)行 mutableCopy操作 是內(nèi)容拷貝(深拷貝)
2.對mStr進(jìn)行mutableCopy操作的mutableCopyStr是NSMutableString類型的
綜合以上所述:只有對不可變對象進(jìn)行copy操作是指針拷貝(淺拷貝)墨技,其他的都是內(nèi)容拷貝(深拷貝)