知识巩固之 copy 与 mutableCopy

核心思想:

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

你可能感兴趣的:(知识巩固之 copy 与 mutableCopy)