iOS深拷贝和浅拷贝

深拷贝:内容拷贝,拷贝出来的对象和之前的对象的地址不一样。

浅拷贝:指针拷贝,拷贝出来的对象和之前的对象的地址一样。

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操作是指针拷贝(浅拷贝),其他的都是内容拷贝(深拷贝)

你可能感兴趣的:(iOS深拷贝和浅拷贝)