Strong和Copy的区别

Strong和Copy对于NSString、NSDirectory、NSArray的区别

当NSString、NSDirectory、NSArray在声明属性的时候设置为Strong类型时:

(1) 调用set方法赋值

@property (nonatomic, strong) NSString *str;

@property (nonatomic, strong) NSArray *array;

@property (nonatomic, strong) NSDictionary *dic;

 NSMutableString *mustr = [[NSMutableString alloc]initWithFormat:@"123"];
    self.str = mustr;
    NSLog(@"%@",_str);
    [mustr appendString:@"456"];
    NSLog(@"%@",_str);
    
    NSMutableArray *muarray = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];
    self.array = muarray;
    NSLog(@"%@",_array);
    [muarray addObject:@"d"];
    NSLog(@"%@",_array);
    
    NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"a",@"1",@"b",@"2",nil];
    self.dic = muDic;
    NSLog(@"%@",_dic);
    [muDic setObject:@"3" forKey:@"c"];
    NSLog(@"%@",_dic);

输出结果:

屏幕快照 2017-02-23 17.40.33.png

(2)直接对实例对象赋值

@property (nonatomic, strong) NSString *str;

@property (nonatomic, strong) NSArray *array;

@property (nonatomic, strong) NSDictionary *dic;

NSMutableString *mustr = [[NSMutableString alloc]initWithFormat:@"123"];
    _str = mustr;
    NSLog(@"%@",_str);
    [mustr appendString:@"456"];
    NSLog(@"%@",_str);
    
    NSMutableArray *muarray = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];
    _array = muarray;
    NSLog(@"%@",_array);
    [muarray addObject:@"d"];
    NSLog(@"%@",_array);
    
    NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"a",@"1",@"b",@"2",nil];
    _dic = muDic;
    NSLog(@"%@",_dic);
    [muDic setObject:@"3" forKey:@"c"];
    NSLog(@"%@",_dic);

输出结果:

屏幕快照 2017-02-23 17.47.13.png

结论:当把NSString、NSDirectory、NSArray声明为strong,那么如果原对象的值发生变化,会影响到当前对象的值,不管当前对象是调用点语法赋值还是直接对实例对象赋值。

当NSString、NSDirectory、NSArray在声明属性的时候设置为Copy类型时:

(1)调用set方法赋值

@property (nonatomic, copy) NSString *str;

@property (nonatomic, copy) NSArray *array;

@property (nonatomic, copy) NSDictionary *dic;

  self.str = mustr;
    NSLog(@"%@",_str);
    [mustr appendString:@"456"];
    NSLog(@"%@",_str);
    
    NSMutableArray *muarray = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];
    self.array = muarray;
    NSLog(@"%@",_array);
    [muarray addObject:@"d"];
    NSLog(@"%@",_array);
    
    NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"a",@"1",@"b",@"2",nil];
    self.dic = muDic;
    NSLog(@"%@",_dic);
    [muDic setObject:@"3" forKey:@"c"];
    NSLog(@"%@",_dic);

输出结果:

屏幕快照 2017-02-23 18.08.58.png

(2)直接对实例对象赋值

@property (nonatomic, copy) NSString *str;

@property (nonatomic, copy) NSArray *array;

@property (nonatomic, copy) NSDictionary *dic;

NSMutableString *mustr = [[NSMutableString alloc]initWithFormat:@"123"];
  _str = mustr;
  NSLog(@"%@",_str);
  [mustr appendString:@"456"];
  NSLog(@"%@",_str);
  
  NSMutableArray *muarray = [NSMutableArray arrayWithObjects:@"a",@"b",@"c",nil];
  _array = muarray;
  NSLog(@"%@",_array);
  [muarray addObject:@"d"];
  NSLog(@"%@",_array);
  
  NSMutableDictionary *muDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"a",@"1",@"b",@"2",nil];
  _dic = muDic;
  NSLog(@"%@",_dic);
  [muDic setObject:@"3" forKey:@"c"];
  NSLog(@"%@",_dic);

当设置为Copy属性时,如果调用点语法赋值,当前对象不会因为原对象的改变而改变,但是如果是直接赋值,那么原对象改变那么当前对象也会改变。

总结:当对NSString这种有可变子类的对象直接赋值时,不管声明属性时声明的是copy还是strong,现对象的值都会随着原对象的值而改变。当调用set方法赋值时,如果对象声明的是copy那么现有对象不会因为原对象的改变而改变,如果声明的是strong,那么现有对象会因为原对象的改变而改变。

个人理解:声明为strong时,其实只是把当前对象的指针指向了原有对象的地址,因此当原有对象改变时,现有对象也会改变。直接赋值也应该是这样。当声明为Copy时,其实是把原有对象复制了一份,然后让现有对象的指针指向复制的这一份。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 如图,不可变 string 从图中打印来看,并无不同 如图,可变 string 的打印,copyString的地址...
    记忆岸阅读 736评论 1 2
  • 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果pro...
    Amok校长阅读 1,116评论 0 0
  • 之前在开发的过程中,对定义类的属性用stong还是copy总是有一点迷惑,现在结合代码来巩固一下认知。定一一个Pe...
    wjam小涛涛阅读 774评论 0 0
  • 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果pro...
    Dr_zhang阅读 218评论 0 1
  • 那个周末 阳光明媚如初 朋友载上我 漫无目的转悠 远处 一片绯红 吸引了我们的视线 朋友知道我的“好色” 稳稳地停...
    蒹葭苍苍123阅读 461评论 6 4

友情链接更多精彩内容