OC中porperty copy和strong对比

前言: 第一次在上写文章,还是挺激动滴.以后会不定期更新自己学到的东西,文章有错误或者大家有什么建议请跟帖.学习无止境,希望在学习的道路上大家一起共勉!

本文主要讨论iOS开发中NSString属性是用copy还是用strong修饰的问题,讨论之前需要先了解深拷贝和浅拷贝

深拷贝和浅拷贝

  • 浅拷贝
    • 定义: 原对象和副本对象是同一个对象
    • 本质: 没有产生新对象
NSString *str = @"kris";
NSString *strCopy = [str copy];
NSLog(@"str地址:%p, strCopy地址:%p", str, strCopy);

//输出结果: str1地址:0x100001030, str2地址:0x100001030
  • 深拷贝
    • 定义: 原对象和副本对象不是同一个对象
    • 本质: 产生了新对象
NSString *str = @"kris";
NSMutableString *strCopy = [str mutableCopy];
NSLog(@"str = %p, strCopy = %p", str, strCopy);

//输出结果: str = 0x100001030, strCopy = 0x100b00580
  • 总结: 当原对象和副本对象都不可变时是浅拷贝,其他都是深拷贝
    • 例如: 对于NSString来说,当原对象和副本对象都是NSString的时候,就是浅拷贝,其他情况都是深拷贝

copy和mutableCopy区别

  • copy: 使用copy后的对象都是不可变对象
  • mutableCopy: 使用mutableCopy后的对象都是可以变对象
原对象 修饰符(方法) 副本对象
NSString copy NSString
mutableCopy NSMutableString
NSMutableString copy NSString
mutableCopy NSMutableString

copy和Strong修饰符问题

首先看下两者修饰的效果

  • 新建一个Person类,在.h文件中用property声明属性name
  • main函数中的方法为
Person *p = [[Person alloc] init];
NSMutableString *str = [NSMutableString stringWithFormat:@"kris"];
p.name = str;
//在str后面拼接一个字符串
[str appendString:@"_itdog"];
NSLog(@"p.name = %@, str = %@", p.name, str);

用copo修饰

  • Person的.h文件中的name属性:
@property (nonatomic, copy) NSString *name;
  • 运行结果
p.name = kris, str = kris_itdog

使用strong修饰

  • Person的.h文件中的name属性:
@property (nonatomic, strong) NSString *name;
  • 运行结果
p.name = kris_itdog, str = kris_itdog

copy实现原理

  • 用property声明的属性会自动在.m文件中生成getter/setter方法,用copy修饰其实就是在属性的setter方法赋值的时候使用了copy方法,代码如下:
- (void)setName:(NSString *)name
{
    _name = [name copy];
}

总结

  1. 苹果一般情况下推荐开发者使用copy修饰NSString,防止外界是可变字符串时,修改外界的值会影响属性的值
    • 注: 如果外界是不可变字符串则没有影响
  2. 用copy修饰属性,其实就是重写属性的setter方法,并且将外面的值拷贝一份给属性,是深拷贝

注意:

  • 在日常开发中,我们接收的数据一般从网络获取,而且获取的值一般是字典,一般都是不可变的值,所以开发中一般用strong修饰NSString,因为如果用copy修饰,每次都会在内部调用copy方法,当数据很多时,每次都会调用copy方法,会影响性能,所以用strong会提升一定的性能

你可能感兴趣的:(OC中porperty copy和strong对比)