美文网首页技术文档
为什么NSSTring对象用copy修饰

为什么NSSTring对象用copy修饰

作者: 哈利波特会魔法 | 来源:发表于2018-02-07 16:40 被阅读9次

    相信有很多人都有这个疑惑,为什么NSString对象用copy修饰?其实NSString也是可以用strong修饰的但是最好还是选择copy,为啥呢 ?请看下面的解释
    copy的意思是对值进行拷贝,分为浅拷贝与深拷贝,深拷贝会产生一个新对象;
    strong是强引用,对象指针指向的是同一个,不会产生新对象;
    我们先来看一个例子

    @property (nonatomic, strong) NSMutableString *strStrong;
    @property(nonatomic, copy) NSmutableString *strCopy;
    
    NSMutableString *name = [[NSMutableString alloc] initWithString: @"hello"];
    self.strStrong = name;
    self.strCopy = name;
    //1.此时给name拼接一个字符
    [name appendString: @"word"];
    NSLog(@"%@ %p", name, name);
    NSLog(@"%@ %p", self.strStrong, self.strStrong);
    NSLog(@"%@ %p", self.strCopy, self.strCopy);
    结果为:
    helloword 0x6000002495d0
    helloword 0x6000002495d0
    hello     0xa00006f6c6c65685
    
    2.给self.strStrong拼接一个字符
    [self.strStrong appendString: @"!!!!"];
    NSLog(@"%@ %p", name, name);
    NSLog(@"%@ %p", strStrong, strStrong);
    NSLog(@"%@ %p", strCopy, strCopy);
    结果为:
    helloword!!!! 0x60400025d790
    helloword!!!! 0x60400025d790
    hello            0xa00006f6c6c65685
    

    可以看出,用strong修饰的属性strStrong,随着name值的变化,也跟着变化,然而copy修饰的值就没有发生变化,更加安全。
    使用copy,主要是为了防止当NSMutableString赋值给NSString时,两者之一变化,都会引起另外一个值变化。

    下面讲一下深拷贝与浅拷贝

        NSString *copy = @"apple";
        NSString *copyString1 = [copy copy];//原对象
        NSString *copyMuStr1 = [copy mutableCopy];//产生新的对象
        NSLog(@"%p %p %p", copy, copyString1, copyMuStr1);
        //0x1034c2118 0x1034c2118 0x60400025f5c0
        
        NSMutableString *mutabStr = [NSMutableString stringWithString:@"watermelon"];
        NSString *copyStr2 = [mutabStr copy];//产生新的对象
        NSString *copyMuStr2 = [mutabStr mutableCopy];//产生新的对象
        NSLog(@"%p %p %p", mutabStr, copyStr2, copyMuStr2);
        //0x600000247800 0x60000003fd40 0x600000247530
    
    AAC3A81E1115A66FBDAA1966DD89CE89.png

    相关文章

      网友评论

        本文标题:为什么NSSTring对象用copy修饰

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