iOS

iOS-NSString strong copy mutable

2019-07-12  本文已影响0人  厦门_小灰灰

聊一聊NSString的strong copy mutableCopy。

简单概括一下深拷贝和浅拷贝。

浅拷贝:

指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝

深拷贝:

内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区

先定义两个NSString属性

@property (nonatomic, strong) NSString *strongString;
@property (nonatomic, copy) NSString *copyedString;

一个用strong,一个用copy。

不可变字符串赋值

NSString *string = @"hui";
self.strongString = string;
self.copyedString = string;

NSLog(@"%p, %p, %p", string, self.strongString, self.copyedString);

打印地址的结果:

0x10e93b078, 0x10e93b078, 0x10e93b078

可见,不管是strong还是copy属性的对象,将不可变的字符串赋值给它们,它们都执行的是浅拷贝。

所以它们都指向了同一个地址。

可变字符串赋值

NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
self.strongString = mutableString;
self.copyedString = mutableString;

NSLog(@"%p, %p, %p", mutableString, self.strongString, self.copyedString);

打印地址的结果:

0x600003866700, 0x600003866700, 0x89853a7b95263aa8

从打印结果中可以发现,strong修饰的字符串(strongString)与mutableString指向了同一个地址,但是copy修饰的字符串(copyedString)指向了另外一个地址。因为执行了深拷贝。

不可变字符串调用mutableCopy

NSString *string = @"hui";
[[string mutableCopy] appendFormat:@"_li"];
//    [[string copy] appendString:@"_li"];  这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
NSLog(@"%p, %p", string, [string mutableCopy]);

打印结果:

0x10ee70078, 0x6000037cec40

通过打印结果,可以得到,不可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。

可变字符串调用mutableCopy

NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
[[mutableString mutableCopy] appendFormat:@"_li"];
//    [[mutableString copy] appendString:@"_li"];  //这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
NSLog(@"%p, %p", mutableString, [mutableString mutableCopy]);

打印结果:

0x6000000916b0, 0x6000000c4b40

通过打印结果,可以得到,可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。

总结:

1. strong出来的字符串,执行的是浅拷贝;
2. copy出来的字符串一定是不可变的字符串。传入的字符串如果不可变,那么执行的就是浅拷贝;如果是可变,那么执行的就是深拷贝;
3. mutableCopy出来的字符串一定是可变的字符串,无论传入的字符串可变与否,都是执行深拷贝;

over!

上一篇下一篇

猜你喜欢

热点阅读