Fork me on GitHub

NSString为什么要使用copy修饰

写在前面

NSString 属性为什么应该使用copy修饰,使用strong为什么不行?我们可能都知道NSString/Blocks类型的属性使用copy来修饰,why?最近看到这篇blog感觉讲得较完善,那么我也把自己的一点体会和理解记录下吧,欢迎指正。

  • 我们先定义一个测试类BMPerson
1
2
3
4
5
6
7
@interface BMPerson : NSObject
@property (strong, nonatomic) NSString *strStrong; ///< strStrong
@property (copy, nonatomic) NSString *strCopy; ///< strCopy
@end

@implementation BMPerson
@end
  • main函数中执行如下代码:
1
2
3
4
5
6
7
NSString *str = @"abc";
BMPerson *per = [BMPerson new];
per.strStrong = str;
per.strCopy = str;
NSLog(@"修改str前:per.strStrong = %@ per.strCopy = %@", per.strStrong, per.strCopy);
str = @"qwe";
NSLog(@"修改str前:per.strStrong = %@ per.strCopy = %@", per.strStrong, per.strCopy);

会输出如下的log

1
2
修改str前:per.strStrong = abc per.strCopy = abc
修改str前:per.strStrong = abc per.strCopy = abc
  • 似乎是strongcopy没有任何区别,那么我们换一种方式看看,使用下面的代码测试
1
2
3
4
5
6
7
NSMutableString *str = [NSMutableString stringWithFormat:@"abc"];
BMPerson *per = [BMPerson new];
per.strStrong = str;
per.strCopy = str;
NSLog(@"修改str前:per.strStrong = %@ per.strCopy = %@", per.strStrong, per.strCopy);
[str appendString:@"+a"];
NSLog(@"修改str前:per.strStrong = %@ per.strCopy = %@", per.strStrong, per.strCopy);

会输出如下的log

1
2
修改str前:per.strStrong = abc per.strCopy = abc
修改str前:per.strStrong = abc+a per.strCopy = abc

我们发现本来给 per.strStrong 赋值的是 @“abc”,但在修改了str后发现per.strStrong的值也变了,但是使用copy修饰的并不会变化,在这篇blog的基础上简单画了下内存分配图如下:

  • 第一种方式

  • 第二种方式

  • 由上面的图我们应该可以发现问题所在(如果不清楚可以下方留言哈),所以NSSring类型的属性时我们尽量使用copy修饰吧。

最后

参考

- END -
关注微信公众号,发现更多精彩

文章作者:梁大红

特别声明:若无特殊声明均为原创,转载请注明,侵权请联系

版权声明:署名-非商业性使用-禁止演绎 4.0 国际