美文网首页
iOS 关于深拷贝浅拷贝问题

iOS 关于深拷贝浅拷贝问题

作者: c608 | 来源:发表于2018-08-20 18:51 被阅读10次
    1、对于一个字符串来讲的话,如果是用strong来修饰和用copy修饰的区别

    strong修饰相当于是浅拷贝,copy如果是不可变字符串则相当于深拷贝

    //创建两个字符串,分别用strong和copy修饰
    @property (nonatomic, strong) NSString *strongStr;
    @property (nonatomic, copy) NSString *copysStr;
    

    这时候一个可变字符串来给属性赋值

    //可变字符串进行赋值
    - (void)copyAndStrong {
        NSMutableString *mutbleString = [NSMutableString stringWithFormat:@"test~~"];
        self.strongStr = mutbleString;
        self.copysStr = mutbleString;
        
            //[mutbleString appendString:@"11111"];
        
        NSLog(@"mut origin string: %p, %p", mutbleString, &mutbleString);
        NSLog(@"mut strong string: %p, %p", _strongStr, &_strongStr);
        NSLog(@"mut copy string: %p, %p", _copysStr, &_copysStr);
        NSLog(@"str = %@ strongStr = %@, copyStr = %@",mutbleString,_strongStr,_copysStr);
    }
    
    打印结果

    可以看到strong修饰的属性指向的地址和字符串地址一样,证明是浅拷贝,copy修饰的则新开辟了一个内存地址
    此时如果对字符串进行

    [mutbleString appendString:@"11111"];
    
    修改字符串后结果

    可以看到,修改字符串的值,strongStr也随着改变,证明是浅拷贝

    如果用不可变字符串来给属性赋值又是什么效果呢?请往下看
    - (void)copyAndStrong {
        NSString *string = [NSString stringWithFormat:@"test~~"];
        self.strongStr = string;
        self.copysStr = string;
        NSLog(@"mut origin string: %p, %p", string, &string);
        NSLog(@"mut strong string: %p, %p", _strongStr, &_strongStr);
        NSLog(@"mut copy string: %p, %p", _copysStr, &_copysStr);
        NSLog(@"str = %@ strongStr = %@, copyStr = %@",string,_strongStr,_copysStr);
    }
    
    打印结果

    可以发现都是指针拷贝,也就是我们所讲的浅拷贝

    2 关于copy和mutableCopy的区别

    个人总结就是:
    1.1:对于可变对象,使用copy和mutableCopy都会创建一个新的内存地址,也就是深拷贝
    1.2:对于不可变对象,使用copy则不会创建新对象,是浅拷贝,使用mutableCopy则会创建新的内存地址,是深拷贝

    [immutableObject copy] // 浅复制
    [immutableObject mutableCopy] //深复制
    [mutableObject copy] //深复制
    [mutableObject mutableCopy] //深复制
    
    3 关于block为何用copy修饰

    这个问题,就是看网上大家讲的


    截图资料

    相关文章

      网友评论

          本文标题:iOS 关于深拷贝浅拷贝问题

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