assign是用来修饰基本数据类型的,他不会对引用计数有任何影响,而字符串是一个对象,肯定需要设计到内存管理相关的东西,assign修饰的对象在此对象释放的时候,指针地址依然存在,不会被置为nil,这就会造成很严重的问题,也就是会产生野指针。但是用weak来修饰的话在对象释放的时候会把指针置为nil,从而避免野指针的出现

使用 strong 修饰,引用的对象是同一个,如果该对象在其他地方被修改,这里的也会同步修改。

使用 copy 修饰,可以对原有对象拷贝一份,之前对象如果被修改了,不会影响你现在持有的

当源字符串是NSMutableString时,strong只是将原字符串的引用计数加1,而copy则是对原字符串做了次深拷贝,从而生成了一个新的对象,并且copy的对象指向这个新的对象。另外需要注意的是,这个copy属性对象的类型始终是NSString,而不是NSMutableString,如果想让拷贝过来的对象是可变的,就需要使mutableCopy

如果原字符串是NSMutableString的时候,使用strong只会增加引用计数器。但是copy会执行一次深拷贝,会造成不必要的内存浪费。而如果原字符串是NSString时,copy和strong效果一样,就不会有这个问题。

但是,一般我们声明NSString时,也不会希望它改变,所以一般情况下,建议用copy,这样可以避免NSMutableString带来的奇葩错误