核心思想:
1. Copy & mutableCopy 都是产生一个与源对象互不影响的副本。
2. Copy 产生一个不可变的副本;mutableCopy 产生一个可变的副本;
一、非集合类对象
代码
NSMutableString *str = [NSMutableString stringWithString:@"666"];
NSString *cstr = str.copy;
cstr = @"3333";
NSLog(@"cstr-->%@\t 地址->%p", cstr, cstr);
NSMutableString *mcstr = str.mutableCopy;
[mcstr appendFormat:@"2"];
NSLog(@"mcstr-->%@\t 地址->%p", mcstr, mcstr);
NSMutableString *msss = str.copy;
[msss appendFormat:@"3"]; // 此处crash //使用copy 实质上copy出来的是一份不可变对象
/* -[NSTaggedPointerString appendFormat:]: unrecognized selector sent to instance 0xa000000003636363
*/
NSLog(@"msss-->%@\t 地址->%p", msss, msss);
log日志
2018-05-18 10:55:57.471250+0800 copy_pcy[6172:340363] cstr-->3333 地址->0x1000c2080
2018-05-18 10:55:57.471502+0800 copy_pcy[6172:340363] mcstr-->6662 地址->0x60000025e780
2018-05-18 10:55:57.471964+0800 copy_pcy[6172:340363] msss-->666 地址->0xa000000003636363
第三个log未打印, 是由于str.copy 出来的是一份不可变对象。 使用可变对象的实例方法。导致方法找不到,崩溃。
二、集合类对象
代码
NSNumber *n1 = [NSNumber numberWithInt:1];
NSNumber *n2 = [NSNumber numberWithInt:2];
NSNumber *n3 = [NSNumber numberWithInt:3];
NSNumber *n4 = [NSNumber numberWithInt:4];
NSLog(@"n1地址->%p", n1);
NSMutableArray *a = [NSMutableArray arrayWithObjects:n1, n2, n3, n4, nil];
NSArray *imca = a.copy;
NSLog(@"imca->%@\n 地址->%p\n 元素 n1 地址->%p", imca, imca, imca[0]);
NSMutableArray *mca = a.mutableCopy; // 对象内容拷贝; 元素浅拷贝,指针指向原对象中的元素地址;
[mca removeObjectAtIndex:2];
NSLog(@"mca->%@\n 地址->%p\n 元素 n1 地址->%p", mca, mca, mca[0]);
NSMutableArray *ca = a.copy; // 对象指针拷贝; 元素同上
[ca removeObjectAtIndex:2]; // 此处崩溃 原因同非集合类对象
/* -[__NSFrozenArrayM removeObjectAtIndex:]: unrecognized selector sent to instance 0x60000025b9c0
*/
NSLog(@"ca->%@\n 地址->%p\n 元素 n1 地址->%p", ca, ca, ca[0]);
log日志
2018-05-18 10:51:38.198145+0800 copy_pcy[6090:317104] n1地址->0xb000000000000012
2018-05-18 10:51:38.198457+0800 copy_pcy[6090:317104] imca->(
1,
2,
3,
4
)
地址->0x60000005b9f0
元素 n1 地址->0xb000000000000012
2018-05-18 10:51:38.198684+0800 copy_pcy[6090:317104] mca->(
1,
2,
4
)
地址->0x60000005b840
元素 n1 地址->0xb000000000000012
2018-05-18 10:51:38.199151+0800 copy_pcy[6090:317104] ca->(
1,
2,
3,
4
)
地址->0x60000005b8a0
元素 n1 地址->0xb000000000000012
网友评论