在我们的编程过程中,我们通常会定义很多属性。那么问题来了,在定义属性的时候, 我们是需要用copy还是用strong。
下面以NSString为例,在我们通常的定义中。我们会定义NSString和NSMutableString两种类型。在NSString模式下,因为其性质为不可变的字符串,所以,不论copy还是NSString修饰的属性的对象指向的都是同一个地址。即,NSString指向的地址。假如,在MRC的模式下,打印NSString的计数情况,我们就会清楚的看到,NSString的计数为3。也就是说不论是strong操作还是copy操作的作用都是是NSString的引用计数值加一。
当我们把NSString改变为NSMutableString类型时,在MRC的模式下打印NSString的计数情况,发现引用计数的值变为2。而通过copy操作的引用计数的值为1。也就是说,通过strong操作,指向的是NSMutableString的地址,当NSMutableString值改变的时候,通过strong操作的值,也会跟着改变。但是,copy操作是对NSMutableString的值进行了一次深拷贝,不论NSMutableString的值如何改变都不会影响到copy操作的值。
由此可知,当字符串为NSString类型时,由于字符是不可变的。所以,通过copy和strong操作的值,都是指向NSString的地址,copy操作相当于做了一次先拷贝(伪拷贝)。当字符串为NSMutableString类型时,strong的操作仅仅使引用计数加一,copy操作是对字符串进行一次深拷贝,产生了一个新的对象,copy的属性指向这个新对象的地址。copy属性的对象的类型始终是NSString,所以它是不可变的。
在使用copy和strong时,我们还要从其性能方面进行考虑。当字符串为NSMutableString时,strong操作只是使引用计数加一,而copy操作是进行了一次深拷贝。所以,性能肯定会有差距。当然,NSString类型不存在这种情况。
综上所述,在定义NSString属性时使用copy还是strong根据自己的实际情况来判断。但是,我建议大部分时候使用copy,可以为我们提供更强的保护性。防止因为字符串的修改而发生不可预计的错误。