美文网首页
iOS copy和mutableCopy

iOS copy和mutableCopy

作者: sy随缘 | 来源:发表于2019-03-14 21:59 被阅读0次

    经测试得出如下结论:【测试代码和测试结果见后面】

    不管是非集合类对象,还是集合类对象,执行copy之后的对象,不管是浅复制还是深复制,都是不可变的对象,没有可变对象的增删方法,所以执行增、删方法会崩溃。

    1、非集合类对象

    不可变对象:copy:浅复制
    不可变对象:mutableCopy:深复制,新对象可变
    可变对象:copy:深复制,新对象不可变
    可变对象:mutableCopy:深复制,新对象可变

    非集合类对象测试代码如下:

        NSString *str1 = @"11111";
        NSString *str11 = [str1 copy];
        NSMutableString *str12 = [str1 mutableCopy];
        NSLog(@"原始不可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str1,&str1,str1,[str1 class]);
        NSLog(@"不可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str11,&str11,str11,[str11 class]);
        NSLog(@"不可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str12,&str12,str12,[str12 class]);
        NSLog(@"--------------------------------------");
        NSMutableString *str2 = [NSMutableString stringWithString:@"22222"];
        NSMutableString *str21 = [str2 copy];
        NSMutableString *str22 = [str2 mutableCopy];
        NSLog(@"原始可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str2,&str2,str2,[str2 class]);
        NSLog(@"可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str21,&str21,str21,[str21 class]);
        NSLog(@"可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str22,&str22,str22,[str22 class]);
        
        NSLog(@"-------------------修改原始字符串之后-------------------");
        str1 = @"wwww";
        NSLog(@"原始不可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str1,&str1,str1,[str1 class]);
        NSLog(@"不可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str11,&str11,str11,[str11 class]);
        NSLog(@"不可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str12,&str12,str12,[str12 class]);
        NSLog(@"--------------------------------------");
        [str2 appendString:@"hhh"];
        NSLog(@"原始可变字符串==%@-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str2,&str2,str2,[str2 class]);
        NSLog(@"可变字符串-->copy:%@--------指针自己的地址:%p,对象的地址:%p,对象类型:%@",str21,&str21,str21,[str21 class]);
        NSLog(@"可变字符串-->mutableCopy:%@-指针自己的地址:%p,对象的地址:%p,对象类型:%@",str22,&str22,str22,[str22 class]);
        NSLog(@"--------------------------------------");
        
        [str12 appendString:@"kkk"];
    //    [str21 appendString:@"mmm"];//执行这句话会崩溃,因为是不可变对象
        [str22 appendString:@"nnn"];
    

    非集合类对象测试结果如下:


    image.png

    2、集合类对象

    不可变对象:copy:浅复制
    不可变对象:mutableCopy:单层深复制,新对象可变
    可变对象:copy:单层深复制,新对象不可变
    可变对象:mutableCopy:单层深复制,新对象可变

    单层深复制:新对象包含的元素还是旧的

    集合类对象测试代码如下:

        NSArray *a1 = @[@"1",@"2"];
        NSArray *a2 = @[@"3",@"4"];
        NSArray *a3 = @[@"5",@"6"];
        NSArray *array = @[a1,a2,a3];
        // 不可变对象copy和mutableCopy
        NSArray *arrayCopy1 = [array copy];
        NSMutableArray *arrayCopy2 = [array mutableCopy];
        // 可变对象copy和mutableCopy
        NSMutableArray *arrayMutCopy1 = [arrayCopy2 copy];
        NSMutableArray *arrayMutCopy2 = [arrayCopy2 mutableCopy];
        NSLog(@"原始不可变数组-------------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&array,array,[array class],array[0]);
        NSLog(@"不可变数组-->copy---------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayCopy1,arrayCopy1,[arrayCopy1 class],arrayCopy1[0]);
        NSLog(@"不可变数组-->mutableCopy--指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayCopy2,arrayCopy2,[arrayCopy2 class],arrayCopy2[0]);
        NSLog(@"可变数组-->copy-----------指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayMutCopy1,arrayMutCopy1,[arrayMutCopy1 class],arrayMutCopy1[0]);
        NSLog(@"可变数组-->mutableCopy----指针自己的地址:%p,对象的地址:%p,对象类型:%@,对象中第一个元素的地址:%p",&arrayMutCopy2,arrayMutCopy2,[arrayMutCopy2 class],arrayMutCopy2[0]);
        NSLog(@"--------------------------------------");
        
        [arrayCopy2 addObject:@"8"];
    //    [arrayMutCopy1 addObject:@"9"];//执行这段代码会崩溃,因为copy之后的对象是不可变
        [arrayMutCopy2 addObject:@"10"];
    

    集合类对象测试结果如下:


    image.png

    相关文章

      网友评论

          本文标题:iOS copy和mutableCopy

          本文链接:https://www.haomeiwen.com/subject/ffuhmqtx.html