iOS中copy和strong修饰符的区别

iOS中copy和strong修饰符的区别

//用copys修饰的生成的都是不可变的对象 ,如果调用可变类型方法的直接报错
@property(nonatomic,copy)NSString * cpStr;
@property(nonatomic,strong)NSString *strongStr;

 

1.当copy的对象类型为不可变对象如NSString类型时,和Strong修饰作用是一样的

  NSString *str = @"wxwx";
  self.cpStr =  str;
  self.strongStr = str ;
  str = @"haha";
  NSLog(@"str==%p,\n cpstring==%p,\n storngstr==%p",str,_cpStr,_strongStr);
  NSLog(@"str==%@,\n cpstring==%@,\n storngstr==%@",str,_cpStr,_strongStr);

//打印信息:

str==0x105086190,

 cpstring==0x105086170,

 storngstr==0x105086170

----------

str==haha,

 cpstring==wxwx,

 storngstr==wxwx

很明显两者指向的是同一块内存地址,由于指向不可变的对象不用担心对象值改变引起原始值的变化

2.再来看两者指向可变对象的时候

 NSMutableString *str = [NSMutableString stringWithFormat:@"caca"];
 
    self.cpStr =  str;
    self.strongStr = str ;
   
    [str insertString:@"ha21" atIndex:0];
 
    
    NSLog(@"str==%p,\n cpstring==%p,\n storngstr==%p",str,_cpStr,_strongStr);
    NSLog(@"str==%@,\n cpstring==%@,\n storngstr==%@",str,_cpStr,_strongStr);

可以看到打印信息为:

str==0x600002569aa0,

cpstring==0xf3479ef8a5126e6a,//指向的地址已经改变

 storngstr==0x600002569aa0

----------------------

str==ha21caca,

 cpstring==caca,//copy对象的值还是原始值。

 storngstr==ha21caca

由于指向可变的对象,用copy修饰的话就算对象的值发生改变也不会影响本身(深拷贝)

总结:

当属性为不可变时用copy(防止属性值被篡改),指向可变属性时用strong(注:如果还是用copy,由于copy返回的都是不可变的对象,一旦调用不可变对象的方法就会引起崩溃,所以这里也不能用copy)

对于其他可变非可变类同理(NSArray,NSMutableArray等)

 

iOS中copy和strong修饰符的区别

上一篇:Android studio预览视图工具栏不见了


下一篇:axios跨域