把一个对象赋值给一个属性变量,当这个对象变化了,如果希望属性变量变化就使用strong属性,如果希望属性变量不跟着变化,就是用copy属性。
例:
@interface ViewController ()
@property (nonatomic,retain) NSString *rStr;
@property (nonatomic,copy) NSString *cStr;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableString *mStr = [NSMutableString stringWithFormat:@"abc"];
self.rStr = mStr;
self.cStr = mStr;
NSLog(@"mStr is %@ %p",mStr,&mStr);
NSLog(@"_rStr is %@ %p",_rStr,&_rStr);
NSLog(@"_cStr is %@ %p",_cStr,&_cStr);
[mStr appendString:@"de"];
NSLog(@"mStr is %@",mStr);
NSLog(@"_rStr is %@",_rStr);
NSLog(@"_cStr is %@",_cStr);
}
@end
由此可以看出:
对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。
对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝。
另外说明一下,这两者对内存计数的影响都是一样的,都会增加内存引用计数,都需要在最后的时候做处理。