iOS 深拷贝和浅拷贝

本文详细介绍了iOS中深拷贝和浅拷贝的区别,包括基本类型数组的拷贝和模型数组的拷贝。在模型数组拷贝中,由于默认仅进行指针拷贝,导致修改拷贝后的数组会影响原始数组。为解决此问题,文章提到了利用initWithArray:copyItems:方法配合NSCopying协议实现模型的深拷贝,以及通过归档和解档方式确保模型对象的独立性。
摘要由CSDN通过智能技术生成

深拷贝和浅拷贝

#需求:
A模型 中存放着 多个自定义模型TagModel,
需要将 A模型 中的TagModel数组 拷贝到 B数组 中,
并修改 B数组中的元素,不能影响到A数组,
如果B数组保存成功后回调替换 A模型中的tagModel数组。

这是项目中的常见场景,也是数组拷贝的常见问题,这里分几部讲解
1.深拷贝和浅拷贝的概念;
2.简单数组元素的拷贝;
3.模型数组元素的拷贝;

#一、 深拷贝和浅拷贝的概念
浅拷贝即指针拷贝,不会产生新的对象,使用的是同一块内存地址。浅拷贝是对内存地址的复制,让目标对象指向 和 源对象 指向同一片内存空间。
深拷贝是内容拷贝,会产生新的对象,产生新的地址。


#二、 基本类型 的数组拷贝

###2.1 NSArray 与 copy/mutableCopy
运行代码:

    NSArray  *normalArray = [NSMutableArray arrayWithObjects:@(0),@(1),@(2), nil];
    id copyArray = [normalArray copy];
    id mutableCopyArray = [normalArray mutableCopy];
    NSLog(@"tempArray=%@",[copyArray isKindOfClass:[NSMutableArray class]] ?@"可变数组":@"不可变数组");
    NSLog(@"tempArray2=%@",[mutableCopyArray isKindOfClass:[NSMutableArray class]] ?@"可变数组":@"不可变数组");
    mutableCopyArray[0] = @(80);
    NSLog(@" \nnormalArray=%p\n copyArray=%p\n mutableCopyArray=%p",normalArray,copyArray,mutableCopyArray);
    NSLog(@"normalArray=%@\n copyArray=%@\n mutableCopyArray=%@",normalArray,copyArray,mutableCopyArray);
    

打印结果为:

2019-09-03 22:34:18.932275+0800 xiaojian[901:136568] tempArray=不可变数组
2019-09-03 22:34:18.932467+0800 xiaojian[901:136568] tempArray2=可变数组
2019-09-03 22:34:18.932535+0800 xiaojian[901:136568]  
    normalArray =0x28333c0c0
    copyArray =0x28333e2e0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值