//外界修改了字符串,不会影响里面.
@property (nonatomic, copy) NSString *name;
在我们最开始学习OC的时候,基本上都习惯了NSString类型的属性的存取修饰用copy。
我们来看一下copy帮我们做了什么事情:
- 我们创建一个Person类,给它一个name属性,用copy修饰
- 给name属性一个值
//不可变字符
NSString *name = @"jack";
Person *per = [[Person alloc] init];
per.name = name;
NSLog(@"%p======%p",name,per.name);
- 然后打印,输出了两个相同的地址:
0x108e88220======0x108e88220
- 然后我们换一个可变的字符串
//可变字符串
NSMutableString *name = [NSMutableString stringWithFormat:@"jack"];
Person *per = [[Person alloc] init];
per.name = name;
NSLog(@"%p======%p",name,per.name);
- 然后打印,输出了两个不同的地址:
0x7fda6bc99f10======0xa00000000676d783
- 得出的结论就是在给属性传入一个字符串的时候,copy会帮我们做一个判断
- 如果传进来的是不可变的字符串,就直接_name = name给过去。
- 如果传入的是一个可变的字符串,就重新生成新的地址再给你。
- 而strong修饰的话,就是直接_name = name。
这里就会考虑到一个事情,我们开发当中从服务器接到的数据可以说几乎就是一些不可变的字符串,然后再用模型存起来。再想到一个项目当中的属性可能成百上千,每一个copy修饰的属性内部在赋值的时候都做了上面所说到的一次判断。
而strong就不用做那一次判断。所以现在我会偏向于用strong来修饰NSString属性。也算是一点点性能上的优化吧。