深拷贝:内容拷贝,拷贝出来的对象和之前的对象的地址不一样。
浅拷贝:指针拷贝,拷贝出来的对象和之前的对象的地址一样。
1.对可变对象进行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);
}
结论:1.对可变对象 进行 copy 操作是内容拷贝(深拷贝)
2. copy 出来的copyStr是NSString类型的,如果对copyStr调用
NSMutableString的方法appendString是会崩溃的。
2.对可变对象进行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);
}
结论:1.对可变对象 进行 mutableCopy 操作是内容拷贝(深拷贝)
2. mutableCopy 出来的mutableCopyStr是 NSMutableString 类型
3.对不可变对象进行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);
}
结论:对不可变对象 进行 copy 操作是指针拷贝(浅拷贝)
4.对不可变对象进行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);
}
结论:1.对不可变对象 进行 mutableCopy操作 是内容拷贝(深拷贝)
2.对mStr进行mutableCopy操作的mutableCopyStr是NSMutableString类型的
综合以上所述:只有对不可变对象进行copy操作是指针拷贝(浅拷贝),其他的都是内容拷贝(深拷贝)