在iOS开发中经常见到copy,strong修饰符。在NSString的属性中会看到copy和strong的存在。大部分情况下NSString的属性都是copy。那么strong和copy的区别是什么?
@property (nonatomic, copy) NSString *string1;
@property (nonatomic, strong) NSString *string2;
定义方法
- (void)judge
{
NSString *string3 = @"abc";
self.string1 = string3;
self.string2 = string3;
NSLog(@"string3===%p %p", string3, &string3);
NSLog(@"string1===%p %p", self.string2, &_string1);
NSLog(@"string2===%p %p", self.string2, &_string2);
}
打印结果
string3===0x10d7210b0 0x7fff525af298
string1===0x10d7210b0 0x7fe11bc0ebb0
string2===0x10d7210b0 0x7fe11bc0ebb8
此时将string3 = @”qwr”;
打印结果
string3===0x10cc1d130 0x7fff530b4298
string1===0x10cc1d0b0 0x7fbc06e0a170
string2===0x10cc1d0b0 0x7fbc06e0a178
我们发现只有string3有变。strin1和string2指向的还是原来的值
结论:使用NSString类的时候,无论使用copy还是strong,当再次改变时,还是指向原来的位置。也就是浅拷贝
使用NSMutableString声明
NSMutableString *string3 = [NSMutableString stringWithFormat:@"abc"];
self.string1 = string3;
self.string2 = string3;
NSLog(@"%@", self.string1);
NSLog(@"%@", self.string2);
NSLog(@"%@", string3);
[string3 appendString:@"qwr"];
NSLog(@"%@", self.string1);
NSLog(@"%@", self.string2);
NSLog(@"%@", string3);
打印结果
string1 ==== abc
string2 ==== abcqwr
string3 ==== abcqwr
当string3改变的时候,用strong修饰的string2随着一起变动。而用copy修饰的string1没有变动
结论:使用NSMutableString类的时候,使用copy修饰会产生新的对象,两者指向新的位置,也就是深拷贝