美文网首页
NSString到底是用copy还是strong?

NSString到底是用copy还是strong?

作者: ibiaoma | 来源:发表于2016-10-31 14:04 被阅读86次

    本质上来讲,copystrong都没有错,但不是说,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

    只需要记住一点,当你给你的的NSString对象赋值时,如果来源是NSMutableString,那么这种情况就必须要用copy;如果你确定来源是不可变类型的,比如**@"http://www.jianshu.com"****这种固定的字符串,那么用strong比较好

    相关文章

      网友评论

          本文标题:NSString到底是用copy还是strong?

          本文链接:https://www.haomeiwen.com/subject/wjryuttx.html