NSString为什么要用copy关键字,如果用strong会有什么问题?

NSString为什么要用copy关键字,如果用strong会有什么问题?(注意:这里没有说用strong就一定不行。使用copy和strong是看情况而定的)

直接上代码

@property (nonatomic, strong) NSString *myMutableStr;
@property (nonatomic, copy) NSString *myStr;

NSMutableString *mutableBStr = [NSMutableString stringWithString:@"bbbbbb"];

self.myMutableStr = mutableBStr; NSLog(@"%@",self.myMutableStr);

[mutableBStr appendString:@"aaa"];

NSLog(@"%@",self.myMutableStr);

NSMutableString *BStr = [NSMutableString stringWithString:@"bbbbbb"];

self.myStr = BStr; NSLog(@"%@",self.myStr);

[BStr appendString:@"aaa"];

NSLog(@"%@",self.myStr);

log截图如下

总结如下:

众所周知,我们知道,可变类型(NSMutableArray,NSMutableString等)是不可边类型(NSString,NSArray等)的子类,因为多态的原因,我们可以使用不可边类型去接受可变类型。

1.当我们使用strong修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值也会发生改变。引文strong只是让创建的对象引用计数器+1,并返回当前对象的内容地址,当我们修改B指向的内容的时候,A指向的内容也同样发生了改变,因为他们指向的内存地址是相同的,是一份内容。(浅拷贝)

2.当我们使用copy修饰A不可边类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值不会发生改变。因为当时用copy的修饰的时候,会拷贝一份内容出来,并且返回指针给A,当我们修改B指向的内容的时候,A指向的内容是没有发生改变的。因为A指向的内存地址和B指向的内存地址是不相同的,是两份内容。(深拷贝)

3.copy修饰不可边类型(NSString,NSArray等)的时候,且使用不可边类型进行赋值,表示浅拷贝,只拷贝一份指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可边类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中。表示两份内容。

你可能感兴趣的:(NSString为什么要用copy关键字,如果用strong会有什么问题?)