美文网首页
iOS Copy与Strong详解

iOS Copy与Strong详解

作者: 做个有趣的程序员 | 来源:发表于2019-09-25 14:30 被阅读0次

    OC语言中,最基础的对象修饰,copy与strong的区别:

    @property (nonatomic, strong) NSString *strStrong;
    @property (nonatomic, copy)   NSString *strCopy;
    

    对于不可变字对象:

    NSString *testStr = @"test";
    self.strStrong = testStr;
    self.strCopy = testStr;
    NSLog(@"test:%@===%p",testStr,testStr);
    NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
    NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
    testStr = @"testChange";
    NSLog(@"test:%@===%p",testStr,testStr);
    NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
    NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
    

    打印结果:

    test:test===0x109dd7080
    strStrong:test===0x109dd7080
    strCopy:test===0x109dd7080
    
    test:testChange===0x109dd7100
    strStrong:test===0x109dd7080
    strCopy:test===0x109dd7080
    

    从结果可以看出:
    strong修饰的字符串,值未发生变化,内存地址与原字符串相同
    copy修饰的字符串,值未发生改变,内存地址与原字符串相同,内存地址拷贝
    为浅拷贝。

    对于可变对象:

     NSMutableString *mutabStr = [[NSMutableString alloc] initWithString:@"test"];
     self.strStrong = mutabStr;
     self.strCopy = mutabStr;
     NSLog(@"test:%@===%p",mutabStr,mutabStr);
     NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
     NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
     [mutabStr appendString:@"change"];
     NSLog(@"test:%@===%p",mutabStr,mutabStr);
     NSLog(@"strStrong:%@===%p",self.strStrong,self.strStrong);
     NSLog(@"strCopy:%@===%p",self.strCopy,self.strCopy);
    

    打印结果:

    test:test===0x60000383e550
    strStrong:test===0x60000383e550
    strCopy:test===0xbaf0bfda97e86f1a
    
    test:testchange===0x60000383e550
    strStrong:testchange===0x60000383e550
    strCopy:test===0xbaf0bfda97e86f1a
    

    从结果可以看出:
    strong修饰的字符串,值发生了变化,内存地址与原字符串相同
    copy修饰的字符串,值未发生改变,内存地址与原字符串不同,内容拷贝
    为深拷贝。

    从上面的对比结果可以看出,
    对于不可变对象:
    使用copy和strong修饰,原对象的值的变化都不会引起赋值对象值的变化。
    对于可变对象:
    使用copy,原对象的值的变化不会引起引用对象值的变化。
    使用strong修饰,在原字符串值发生改变后,会引起赋值对象值变化。
    在项目中尽量使用copy,避免出现上述问题。

    相关文章

      网友评论

          本文标题:iOS Copy与Strong详解

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