美文网首页iOS
iOS-NSString strong copy mutable

iOS-NSString strong copy mutable

作者: 厦门_小灰灰 | 来源:发表于2019-07-12 23:51 被阅读0次

    聊一聊NSString的strong copy mutableCopy。

    简单概括一下深拷贝和浅拷贝。

    浅拷贝:

    指针拷贝,复制一个新的指针,只想同一块内存区域。实际内存并没有发生拷贝

    深拷贝:

    内容拷贝,拷贝数据到一块新内存区域,指针指向拷贝的数据区

    先定义两个NSString属性

    @property (nonatomic, strong) NSString *strongString;
    @property (nonatomic, copy) NSString *copyedString;
    

    一个用strong,一个用copy。

    不可变字符串赋值

    NSString *string = @"hui";
    self.strongString = string;
    self.copyedString = string;
    
    NSLog(@"%p, %p, %p", string, self.strongString, self.copyedString);
    

    打印地址的结果:

    0x10e93b078, 0x10e93b078, 0x10e93b078
    

    可见,不管是strong还是copy属性的对象,将不可变的字符串赋值给它们,它们都执行的是浅拷贝。

    所以它们都指向了同一个地址。

    可变字符串赋值

    NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
    self.strongString = mutableString;
    self.copyedString = mutableString;
    
    NSLog(@"%p, %p, %p", mutableString, self.strongString, self.copyedString);
    

    打印地址的结果:

    0x600003866700, 0x600003866700, 0x89853a7b95263aa8
    

    从打印结果中可以发现,strong修饰的字符串(strongString)与mutableString指向了同一个地址,但是copy修饰的字符串(copyedString)指向了另外一个地址。因为执行了深拷贝。

    不可变字符串调用mutableCopy

    NSString *string = @"hui";
    [[string mutableCopy] appendFormat:@"_li"];
    //    [[string copy] appendString:@"_li"];  这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
    NSLog(@"%p, %p", string, [string mutableCopy]);
    

    打印结果:

    0x10ee70078, 0x6000037cec40
    

    通过打印结果,可以得到,不可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。

    可变字符串调用mutableCopy

    NSMutableString *mutableString = [NSMutableString stringWithString:@"hui"];
    [[mutableString mutableCopy] appendFormat:@"_li"];
    //    [[mutableString copy] appendString:@"_li"];  //这句话执行会报错,因为copy后,拷贝出来的是一个不可变字符串
    NSLog(@"%p, %p", mutableString, [mutableString mutableCopy]);
    

    打印结果:

    0x6000000916b0, 0x6000000c4b40
    

    通过打印结果,可以得到,可变字符串调用mutableCopy执行了深拷贝,拷贝出来的是一个可变的字符串。

    总结:

    1. strong出来的字符串,执行的是浅拷贝;
    2. copy出来的字符串一定是不可变的字符串。传入的字符串如果不可变,那么执行的就是浅拷贝;如果是可变,那么执行的就是深拷贝;
    3. mutableCopy出来的字符串一定是可变的字符串,无论传入的字符串可变与否,都是执行深拷贝;

    over!

    相关文章

      网友评论

        本文标题:iOS-NSString strong copy mutable

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