关于NSString、NSArray、NSDictionary作为属性的时候为什么要用copy,而非strong
1、首先copy 分为深拷贝和浅拷贝,深拷贝是拷贝内容并存放到另一份内存空间,浅拷贝是指针拷贝,会随着内存中对象值 的变化而变化;
2、NSString copy 浅拷贝 得到NSString
NSMutableString copy 深拷贝 得到NSString
NSString mutableCopy 深拷贝 得到NSMutableString
NSMutableString mutableCopy 深拷贝 得到NSMutableString
(NSArray、NSMutableArray;NSDictionary、NSMutableDictionary 同理NSString、NSMutableString)
3、回答上面问题:假如NSString属性用strong(注:strong是浅拷贝)修饰,如果源字符串是NSMutableString赋值给该属性,那么实际得到的也是一个NSMutableString,当源字符串变化的时候,属性也被修改了,这样是不安全的;而用copy修饰NSString属性,不管源字符串是NSString还是NSMutableString,得到的都是一个不可变的字符串,就不存在被修改源字符串的安全问题;
数组、字典同理:
例如:
1、下面代码 执行完,self.strongString会变成@“456789”
- (void)viewDidLoad {
[super viewDidLoad];
_strongStr = @"123";
_mutStr = [NSMutableString stringWithString:@"456"];
_strongStr = _mutStr;
NSLog(@"1---strongStr:%@-------mutStr:%@",self.strongStr,self.mutStr);
[_mutStr appendString:@"789"];
NSLog(@"2---strongStr:%@-------mutStr:%@",self.strongStr,self.mutStr);
_strongArr = @[@1,@2,@3];
_mutArr = [NSMutableArray arrayWithArray:@[@4,@5,@6]];
_strongArr = _mutArr;
NSLog(@"1---strongArr:%@-------mutArr:%@",self.strongArr,self.mutArr);
[_mutArr addObject:@10];
NSLog(@"2---strongArr:%@-------mutArr:%@",self.strongArr,self.mutArr);
}
打印结果是:
TestDemo[11114:334769] 1---strongStr:456-------mutStr:456
TestDemo[11114:334769] 2---strongStr:456789-------mutStr:456789
使用strong修饰到对象,当被一个可变的对象赋值之后,当可变的字符串自身发生异变的时候,strong修饰的字符串也会变
2、而下面代码 执行完,self.string依然是@“456”
@property (nonatomic, copy) NSString *strongStr;
@property (nonatomic, strong) NSMutableString *mutStr;
- (void)viewDidLoad {
[super viewDidLoad];
_strongStr = @"123";
_mutStr = [NSMutableString stringWithString:@"456"];
_strongStr = _mutStr;
NSLog(@"1---strongStr:%@-------mutStr:%@",self.strongStr,self.mutStr);
[_mutStr appendString:@"789"];
NSLog(@"2---strongStr:%@-------mutStr:%@",self.strongStr,self.mutStr);
_strongArr = @[@1,@2,@3];
_mutArr = [NSMutableArray arrayWithArray:@[@4,@5,@6]];
_strongArr = _mutArr;
NSLog(@"1---strongArr:%@-------mutArr:%@",self.strongArr,self.mutArr);
[_mutArr addObject:@10];
NSLog(@"2---strongArr:%@-------mutArr:%@",self.strongArr,self.mutArr);
}
打印结果是:
TestDemo[11114:334769] 1---strongStr:456-------mutStr:456
TestDemo[11114:334769] 2---strongStr:456-------mutStr:456789