属性定义中的copy

如题,网上对深浅拷贝说的比较多,但是对 @property (copy)说明较少,那么这里的copy究竟是如何工作的呢,看代码:


// .h

@interfaceViewController :UIViewController

@property (copy, nonatomic) NSString *testStr;

@end

// .m

NSMutableString *mutableStr = [[NSMutableString alloc] initWithString:@"innesdsfefefefsefef"];

self.testStr = mutableStr;

NSLog(@"m:%@,s:%@",mutableStr,self.testStr);

这段代码中,用mutableStr给self.testStr赋值,此时

属性定义中的copy_第1张图片
image

可以看到,self.testStr已经变成了一个指向NSString子类NSMutableString的指针,且与赋值源mutableStr内存地址不同,这就说明,给用copy修饰的属性赋值,会新开辟一份内存空间来存储赋值源的副本(是内容拷贝,但不同于mutableCopy、深拷贝,这里是指向了源的副本,所以)。

那么下面代码的输出结果就显而易见了

[mutableStrappendString:@"test"];

NSLog(@"m:%@,s:%@",mutableStr,self.testStr);
属性定义中的copy_第2张图片
image

NSString搞清楚了,那么大家一定会对NSArray的表现产生好奇,好吧,也许是我的好奇心作祟,接下来看一下NSArray的情况,相同的操作。

NSMutableArray *mutableArr = [[NSMutableArray alloc] initWithArray:@[@"1",@"2"]];

    self.testArr= mutableArr;

    NSLog(@"%@,%@",mutableArr,self.testArr);

    [mutableArraddObject:@"3"];

    NSLog(@"%@,%@",mutableArr,self.testArr);

属性定义中的copy_第3张图片
image

我们可以看到,同样是不同的内存地址,但是我们似乎忽略了一个细节,里面的元素地址相同么?让我们来看一下

属性定义中的copy_第4张图片
image

这里就体现了Objective-C的特性之一,所谓的单层深拷贝,只有array的地址不同,内部元素都对应地指向了相同的地址。其实还有一个很有趣的现象,NSString拷贝过后,类型是相同的,都是__NSCFString,但是NSArray拷贝过后,类型却是不同的,

image

这里可以看到用copy修饰的NSArray赋值后,类型为__NSArrayI,不是赋值源的__NSArrayM,这似乎和NSString的赋值不太相同。究竟内部实现机制是怎么样的,有待深究,

但copy的效果,很明确,就是单层深拷贝或者内容拷贝

以上。

你可能感兴趣的:(属性定义中的copy)