美文网首页
深拷贝数组中的模型

深拷贝数组中的模型

作者: 烟雨痕 | 来源:发表于2023-04-18 18:18 被阅读0次

一、单层数组的深拷贝


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = UIColor.orangeColor;
    
    PersonModel *model1 = [[PersonModel alloc] init];
    model1.name = @"李";
    model1.age = 20;
    
    PersonModel *model2 = [[PersonModel alloc] init];
    model2.name = @"杨";
    model2.age = 25;
    
    
     NSMutableArray *dataArr = [NSMutableArray array];
    [dataArr addObject:model1];
    [dataArr addObject:model2];
    NSLog(@"dataArr: %@", dataArr);
    NSMutableArray *copyDataArr = [NSMutableArray arrayWithArray:dataArr];
    NSLog(@"copyDataArr: %@", copyDataArr);
    NSMutableArray *deepCopyDataArr = [[NSMutableArray alloc] initWithArray:dataArr copyItems:YES];
    NSLog(@"deepCopyDataArr: %@", deepCopyDataArr);
}
结果:deepCopyDataArr 和 dataArr中的元素地址不同,copyDataArr 和 dataArr中的元素地址仍然相同(元素浅拷贝)。
2023-04-19 18:05:19.440437+0800 ArrayDeepCopyDemo[13315:5896086] dataArr: (
    "<PersonModel: 0x2823674c0>",
    "<PersonModel: 0x282367680>"
)
2023-04-19 18:05:19.440505+0800 ArrayDeepCopyDemo[13315:5896086] copyDataArr: (
    "<PersonModel: 0x2823674c0>",
    "<PersonModel: 0x282367680>"
)
2023-04-19 18:05:19.440542+0800 ArrayDeepCopyDemo[13315:5896086] deepCopyDataArr: (
    "<PersonModel: 0x2823676e0>",
    "<PersonModel: 0x282367760>"
)

注意点: PersonModel 需要服从NSCopying, NSMutableCopying 协议
@interface PersonModel () <NSCopying, NSMutableCopying, NSCoding>

@end

@implementation PersonModel

- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    PersonModel *model = [[self class] allocWithZone:zone];
    model.name = self.name;
    model.age = self.age;
    return model;
}

- (nonnull id)mutableCopyWithZone:(nullable NSZone *)zone {
    return [self copyWithZone:zone];
}

@end

二、数组嵌套数组的深拷贝


- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = UIColor.orangeColor;
    
    PersonModel *model1 = [[PersonModel alloc] init];
    model1.name = @"李";
    model1.age = 20;
    
    PersonModel *model2 = [[PersonModel alloc] init];
    model2.name = @"杨";
    model2.age = 25;
    
    
    NSMutableArray *dataArr = [NSMutableArray array];
    [dataArr addObject:model1];
    [dataArr addObject:model2];
    NSLog(@"dataArr: %@", dataArr);
    
    NSMutableArray *dataList = [NSMutableArray array];
    // 数组添加数组
    [dataList addObject:dataArr];
    NSLog(@"dataList: %@", dataList);
    
    // 深拷贝数组,但是PersonModel对象还是浅拷贝,地址未变化
    NSMutableArray *copyList1 = [[NSMutableArray alloc] initWithArray:dataList copyItems:YES];
    NSLog(@"copyList1: %@", copyList1);
    
    /** 归档: PersonModel对象地址变化 */
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dataList];
    NSMutableArray *copyList2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"copyList2: %@", copyList2);
}
结果:dataArr、 dataList、copyList1里面的PersonModel地址未变化,copyList2的元素PersonModel地址变化。
2023-04-19 18:12:41.609754+0800 ArrayDeepCopyDemo[13324:5898549] dataArr: (
    "<PersonModel: 0x282b852a0>",
    "<PersonModel: 0x282b85460>"
)
2023-04-19 18:12:41.609822+0800 ArrayDeepCopyDemo[13324:5898549] dataList: (
        (
        "<PersonModel: 0x282b852a0>",
        "<PersonModel: 0x282b85460>"
    )
)
2023-04-19 18:12:41.609856+0800 ArrayDeepCopyDemo[13324:5898549] copyList1: (
        (
        "<PersonModel: 0x282b852a0>",
        "<PersonModel: 0x282b85460>"
    )
)
2023-04-19 18:12:41.610019+0800 ArrayDeepCopyDemo[13324:5898549] copyList2: (
        (
        "<PersonModel: 0x282b857e0>",
        "<PersonModel: 0x282b85800>"
    )
)
注意点: PersonModel 需要服从NSCoding 协议
- (void)encodeWithCoder:(nonnull NSCoder *)coder {
    [coder encodeObject:_name forKey:@"name"];
    [coder encodeInteger:_age forKey:@"age"];
}

- (nullable instancetype)initWithCoder:(nonnull NSCoder *)coder {
    if (self = [super init]) {
        _name = [coder decodeObjectForKey:@"name"];
        _age = [coder decodeIntForKey:@"age"];
    }
    return self;
}

相关文章

  • 关于几个拷贝的问题

    数组浅拷贝 数组深拷贝 复合数组深拷贝

  • iOS 数组深复制 NSMutableCopy

    实现模型数组深拷贝的方法1、最笨的方法就是通过遍历逐个拷贝元素 2、也有人使用归档解档实现数组内部元素拷贝 3、这...

  • OC 数组mutableCopy能不能把数组里边的对象深拷贝?

    一. 数组深拷贝,数组中对象不实现NSCopying协议 Person类 使用 结果: 从结果来看虽然数组是深拷贝...

  • iOS 模型数组深拷贝

    通常需要实现对模型的拷贝都需要先实现NSCopying、 NSMutableCopying协议,在这里我一直有个误...

  • javascript 数组以及对象的深拷贝

    数组的深拷贝在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: for 循环实现数组的深...

  • Javascript中的深拷贝

    JS 中深拷贝的几种实现方法 1、使用递归的方式实现深拷贝 //使用递归的方式实现数组、对象的深拷贝 functi...

  • javascript 杂记

    数组杂记 1)数组的判断,使用Array.isArray() 2)一维数组的深拷贝 3)多维数组的深拷贝 4)数组...

  • Javascript深拷贝

    什么是深拷贝 创建一个新的对象或数组时,将原对象/数组的“值”拷贝,而不是“引用”。 深拷贝 数组拷贝不存在多层嵌...

  • 关于OC中数组的深、浅拷贝的小总结

    简而言之:数组的深拷贝,仅仅只是拷贝数组的内容,数组内元素的地址不会变,如果想要数组内的对象元素也深拷贝,则数组内...

  • JS中对象的复制

    JS中的对象复制分为两种情况:深拷贝和浅拷贝。深拷贝和浅拷贝的区别在于对数组和对象的拷贝,对它们拷贝时浅拷贝只是拷...

网友评论

      本文标题:深拷贝数组中的模型

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