验证代码
// - 使用strong和copy 修饰属性
@interface Person : NSObject
@property (nonatomic, copy) NSString *cStr;
@property (nonatomic, strong) NSString *sStr;
@end
NSString *str = @"abcdefghigklmn";
NSMutableString *mStr = [NSMutableString stringWithString:@"abc"];
Person *p = [Person new];
p.cStr = str;
p.sStr = str;
NSLog(@"// - 李超群 console [log] ...str: %@, p.copyStr: %@, p.strongStr: %@", str, p.cStr, p.sStr);
// - 李超群 console [log] ...str: abcdefghigklmn, p.copyStr: abcdefghigklmn, p.strongStr: abcdefghigklmn
/*
str 的地址是 0x100611280, 地址内的内容是
08 04 62 08 02 00 00 00
C8 07 00 00 00 00 00 00
0E 88 02 00 01 00 00 00
0E 00 00 00 00 00 00 00
0~8 字节---> 08 04 62 08 02 00 00 00 isa指针
9~16 字节--> C8 07 00 00 00 00 00 00 一脸懵逼
17~24 字节-> 0E 88 02 00 01 00 00 00 字符串所在的内存
*/
// - memory write 0x010002880E 62
// - str的数据变为 bbcdefghigklmn;
// - p.copyStr : bbcdefghigklmn;
// - p.strongStr : bbcdefghigklmn;
NSLog(@"// - 李超群 console [log] ...str: %@, p.copyStr: %@, p.strongStr: %@", str, p.cStr, p.sStr);
// - 李超群 console [log] ...str: bbcdefghigblmn, p.copyStr: bbcdefghigblmn, p.strongStr: bbcdefghigblmn
p.cStr = mStr;
p.sStr = mStr;
NSLog(@"// - 李超群 console [log] ...str: %@, p.copyStr: %@, p.strongStr: %@", mStr, p.cStr, p.sStr);
// - 李超群 console [log] ...str: abc, p.copyStr: abc, p.strongStr: abc
[mStr appendString:@"d"];
NSLog(@"// - 李超群 console [log] ...str: %@, p.copyStr: %@, p.strongStr: %@", mStr, p.cStr, p.sStr);
// - 李超群 console [log] ...str: abcd, p.copyStr: abc, p.strongStr: abcd
深拷贝和浅拷贝
- 只要出现 mutable(string.mutableCopy, mutableString,copy, mutableString.mutableCopy.)就是深拷贝,此时是将内容拷贝在一个新的地址上, 修改原有的变量不会影响新拷贝的变量
- 而string.copy就是浅拷贝, 拷贝出来一个指针指向原有的变量, 此时如果修改原有的变量的值, 就会影响浅拷贝的对象;
strong和copy
- strong 只是浅拷贝
- copy 同上变的结论相同
思考
对可变对象的(copy, mutableCopy), 因为原对象是可变的, 可以编辑的. 为了保证拷贝出来的目标对象和原对象彻底分离, 所以要深拷贝.
对不可变对象的(mutableCopy), 因为目标对象是可变的, 可以编辑的. 为了保证拷贝出来的目标对象和原对象彻底分离, 所以要深拷贝.
对不可变对象的(copy), 原对象和目标对象都是不可变的, 不可以编辑, 所以浅拷贝即可.