copy和mutableCopy方法简单认识

本文通过一个Objective-C代码示例介绍了如何使用mutableCopy方法进行浅拷贝,并探讨了浅拷贝导致的问题以及如何通过深拷贝解决这些问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//
//  main.m
//  OC语言学习


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {

    @autoreleasepool {
      //copy和mutableCopy方法
//        NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:@"one",@"two",@"three", nil];
        /*
         上面使用不可变字符串来填充dataArray的元素(常量字符串对象是不可变的)。
         下面使用可变字符串代替它来填充数组,这样就可以改变数组中的一个字符串
         */
        NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:
                                     [NSMutableString stringWithString:@"one"],
                                     [NSMutableString stringWithString:@"two"],
                                     [NSMutableString stringWithString:@"three"],
                                     nil
                                     ];
        NSMutableArray *dataArray2;
        NSMutableString *mStr;
        
        //复制一份
        dataArray2 = [dataArray mutableCopy];
        mStr = [dataArray objectAtIndex:0];
        [mStr appendString:@"ONE"]; //将字符串追加到这个元素
        NSLog(@"%@",dataArray);
        
        NSLog(@"%@",dataArray2[0]);//输出:oneONE (原始数组及其副本中的第一个元素的值都被修改了)
        
        /*
         从集合中获取元素时,就得到了这个元素的一个新引用,但并不是一个新副本。
         所以,对dataArray调用objectAtIndex:方法时,返回的对象与dataArray中的第1个元素都指向内存中的同一个对象。
         */
        
        //为上面副本的第一个元素也会改变?
        /*
         这与默认的浅拷贝方式有关。它意味着使用 mutableCopy方法 复制数组时,在内存中为新的数组对象分配了空间,并且将单个元素复制到新数组中。
         然而原始数组中的每个元素复制到新位置,仅将引用从一个数组元素复制到另一个数组元素。
         */
        
        //若要为数组中每个元素创建完全不同的副本,应该怎么办?
        //答:深拷贝(也叫深复制)
        mStr = [NSMutableString stringWithString:[dataArray2 objectAtIndex:0]];
        [mStr appendString:@"ONE"];
        [dataArray2 replaceObjectAtIndex:0 withObject:mStr];
        NSLog(@"dataArray2[0]= %@",dataArray2[0]); //dataArray2[0]= oneONEONE
        NSLog(@"dataArray[0]= %@",dataArray[0]); //dataArray[0]= oneONE
        
        //这样只更改了dataArray2的第一个元素

        
      
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值