iOS 关于深拷贝浅拷贝问题

2018-08-20  本文已影响10人  c608
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修饰

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


截图资料
上一篇下一篇

猜你喜欢

热点阅读