copy和mutablecopy浅见

粗浅的来说copy 是浅复制只复制指针,mutablecopy是深复制复制指针和内容,是在内存的另一份拷贝

详细看一下还是有些许不对

1. 对于一个不可变对象来说 copy 是浅copy 只是指针复制 (这时候用= 赋值和copy一样(=赋值retaincount不变)用copy时retainCount+1, 

   mutablecopy 是深复制 是对象复制

 NSArray *array3 = @[@"12",@"13"];

        NSArray *array4;

        array4 = array3;       // 两个数组的指针指向同一块内存

      //array4 = [array3 copy];// 两个数组的指针指向同一块内存

NSLog(@"%li, %li",array4.retainCount, array3.retainCount);

2.对于可变对象来说 copy 和mutablecopy 都是深copy  都是拷贝对象  不过copy返回的对象是一个不可变对象

        NSMutableArray *array  = [NSMutableArray arrayWithArray:@[@"12",@"13"]];

        array0 = array;              // 浅复制

        array1 = [array copy];       // 对于可变的来说copymutablecopy都是深复制

        array2 = [array mutableCopy];//

        [array removeAllObjects];   // 改变内容, 原来的也会随之改变

        NSLog(@"%@, %li, %li, %p", array0, array0.retainCount, array.retainCount, array);

        NSLog(@"%@, %li, %li, %p", array1, array1.retainCount, array.retainCount, array1);

        NSLog(@"%@, %li, %li, %p", array2, array2.retainCount, array.retainCount, array2);

3.   对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。

      将指针另外复制一份,(如果修改指针指向的内容)  无论深复制,浅复制容器类内容都会改变

 NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];

        NSArray *mArray1copy = [mArray1 copy];

//        NSLog(@"%ld,%ld",mArray1.retainCount,mArray1copy.retainCount);//2,2

        NSMutableArray *mArrayMcopy = [mArray1 mutableCopy];

//        NSLog(@"%ld,%ld",mArray1.retainCount,mArrayMcopy.retainCount);//2,1

        NSMutableString *temp = [mArray1 objectAtIndex:0];

        NSLog(@"%@",temp);//a

        [temp appendString:@"aa"];   // 对指针进行修改,

        NSLog(@"%@",mArray1);//aaa b c

        NSLog(@"%@",mArray1copy); //aaa b c

        NSLog(@"%@",mArrayMcopy);// aaa b c

4.对于容器而言,其元素对象始终是指针复制。如果需要元素对象也是对象复制,就需要实现深拷贝。

 NSArray *mArray1 = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];

 NSArray* trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:

                                      [NSKeyedArchiver archivedDataWithRootObject: mArray1]];

        NSMutableString *temp2 = [mArray1 objectAtIndex:0];

        [temp2 appendString:@"aa"];

        

        NSLog(@"%@",mArray1);//aaa b c

        NSLog(@"%@",trueDeepCopyArray);//a b c

        //trueDeepCopyArray是完全意义上的深拷贝

对mArray1进行改变不影响trueDeepCopyArray

提醒一下: [array removeAllObjects];是在改变数组的内容

         array = nil;是把数组的指针指向空指针位置

         各段程序独立运行








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值