关于NSString、NSArray、NSDictionary作为属性的时候为什么要用copy,而非strong

关于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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值