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修饰
这个问题,就是看网上大家讲的
截图资料