NSString什么时候使用copy,为什么

结论(一般情况下,这样做基本没问题)

[如果你想让这个值是不变的那就用copy就行了,针对NSString来说]

当修饰可变类型的属性时,如NSMutableArray、NSMutableDictionary、NSMutableString,用strong。
当修饰不可变类型的属性时,如NSArray、NSDictionary、NSString,用copy。(你已经确定这个值是不可变的了)

/*
注意:以下NSMutableString值修改 的意思是 appendFormat 之类的操作
*/

大白话(可能有问题,欢迎指正)

str 表示 NSString mStr 表示 NSMutableString
str1 表示被某个修饰的NSString

str1 = Str
//这个时候使用copy和使用strong效果一样
str1 = mStr
//这个时候如果你想让str1是“不可变字符串”,那么用copy
//如果你想让str1是“可变字符串”(虽然它本来定义为NSString),那么你用strong

一般NSString使用copy修饰,是为了保证安全,当给NSString赋值的是NSMutableString时,如果NSMutableString的值被人修改了后,使用被copy修饰的属性的值不变,而使用Strong修饰的属性的值会变化

专业点的话就是(可能有问题,欢迎指正)

当给NSString赋值的是NSMutableString时
被strong修饰的属性 与 NSMutableString对象 指向的是同一个地址 所以当NSMutableString的值变化时,strong修饰的属性值也变、
被copy修饰的属性 与 NSMutableString对象 使用的是 深拷贝 在赋值之前先把NSMutableString的值拷贝了 然后 给 被copy修饰的值 赋值 这时候当NSMutableString修改的时候,被copy修饰的属性值不变,还是原来的值,保证了他是不可变的

最后

当NSString属性的值,你想他是可变的时候,你可以用strong修饰,当然你也可以直接用NSMutableString属性,但注意不要用copy修饰NSMutableString

[如果你想让这个值是不变的那就用copy就行了,针对NSString来说]

文章参考http://blog.csdn.net/winzlee/article/details/51752354
里面介绍了不要用copy修饰NSMutableString的原因(可能会崩溃)

推荐阅读更多精彩内容