- 本质上来讲,使用copy和strong都没有错,但不是说NSString用copy就一定是最好的
那么,什么时候用copy,什么时候用strong呢?
首先为什么要用copy? 因为copy安全!
copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响
比如:
你有一个@property(nonatomic,copy) NSString *str;
然后有一个NSMutableString *sourceStr;
当你进行str = sourceStr
操作之后,紧接着你又改变了sourceStr
的内容sourceStr = @"change";
那么str的内容并不会改变。如果你的str
不是copy修饰的,而是strong修饰的,那么str
的值也会变成@"change";
因为strong是浅拷贝的,并不会对来源的内存地址进行拷贝
那么问题来了:既然copy安全,那为什么不都用copy?
这里我们需要了解一点,copy修饰的NSString在进行set操作时,底层是这样实现的:
我们还是举上面那个例子,进行str = sourceStr
操作时,内部会执行一个操作:
str = [sourceStr copy];
# 那么这个copy里面做了什么呢?
if ([str isMemberOfClass:[str class]])
没错,就是进行一次判断,判断来源是可变的还是不可变的。如果是不可变,接下来的操作就跟strong修饰的没有区别,进行浅拷贝;如果是可变的,那么会进行一次深拷贝。所以copy操作内部会进行判断,别小看了这个if操作所消耗的内存,一次不重要,十次可能也可以忽略不计,但当你的项目十分庞大时,有成百上千个NSString对象,多多少少会对你的App的性能造成一定的影响!
那么回到最初的问题,什么时候用copy,什么时候用strong?