美文网首页
OC 数组mutableCopy能不能把数组里边的对象深拷贝?

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

作者: 再好一点点 | 来源:发表于2021-12-08 10:25 被阅读0次

    一. 数组深拷贝,数组中对象不实现NSCopying协议

    Person类

    @interface Person : NSObject
    @end
    
    #import "Person.h"
    @implementation Person
    @end
    

    使用

        Person *p = [[Person alloc] init];
        NSMutableArray *array = [NSMutableArray arrayWithObject:p];
        NSMutableArray *array1 = [array mutableCopy];
        NSLog(@"%p %p", array, array1);
        NSLog(@"%p %p ", array[0], array1[0]);
    

    结果:

    0x6000010c41b0 0x6000010c4180
    0x600001c58740 0x600001c58740
    

    从结果来看虽然数组是深拷贝,但是数组里边的person对象还是浅拷贝。

    二. 数组深拷贝,数组中对象实现NSCopying

    如果想要数组里边的对象也深拷贝,需要数组里边的对象实现NSCopying协议

    @interface Person : NSObject<NSCopying>
    @property (nonatomic, copy) NSString *name;
    @end
    
    #import "Person.h"
    @implementation Person
    - (id)copyWithZone:(NSZone *)zone {
        Person *person = [[Person alloc] init];
        person.name = self.name;
        return person;
    }
    @end
    

    调用

        Person *p = [[Person alloc] init];
        p.name = @"fhadgjklafg";
        NSMutableArray<Person *> *array = [NSMutableArray arrayWithObject:p];
        NSMutableArray<Person *> *array1 = [[NSMutableArray alloc] initWithArray:array copyItems:YES];
        NSLog(@"%p %p", array, array1);
        NSLog(@"%p %p", array[0], array1[0]);
        NSLog(@"%p %p", array[0].name, array1[0].name);
    

    结果:

    0x60000236c0f0 0x60000236c2a0
    0x600002fec690 0x600002fec6c0
    0x10d73c030 0x10d73c030
    

    从结果来看虽然数组和数组里边的对象是深拷贝,但是数组里边的person对象的name属性还是浅拷贝。

    三. 数组深拷贝,数组中对象实现NSCopying并且对象为不可变对象

        NSString *str = @"test";
        NSMutableArray *array = [NSMutableArray arrayWithObject:str];
        NSMutableArray *array1 = [[NSMutableArray alloc] initWithArray:array copyItems:YES];
        NSLog(@"%p %p", array, array1);
        NSLog(@"%p %p", array[0], array1[0]);
    

    结果:

    0x60000089d5f0 0x60000089d500
    0x102d5edd0 0x102d5edd0
    

    从结果来看虽然数组是深拷贝,NSString实现了NSCopying协议,但是数组里边的对象是不可变对象,所以数组里边的对象仍是浅拷贝。

    四. 数组深拷贝,数组中对象实现NSCopying并且对象为可变对象

        NSMutableString *str = [NSMutableString stringWithString:@"test"];
        NSMutableArray *array = [NSMutableArray arrayWithObject:str];
        NSMutableArray *array1 = [[NSMutableArray alloc] initWithArray:array copyItems:YES];
        NSLog(@"%p %p", array, array1);
        NSLog(@"%p %p", array[0], array1[0]);
    

    结果:

    0x600000403060 0x600000403090
    0x600000403030 0xb33bc96b4270b96c
    

    从结果来看数组是深拷贝,NSMutableString实现了NSCopying协议,数组里边的对象是可变对象,所以数组里边的对象是深拷贝。

    总结:

    如果深拷贝数组的时候需要将数组里边的对象一起深拷贝,不可使用- (id)mutableCopy;,而是使用- (instancetype)initWithArray:(NSArray<ObjectType> *)array copyItems:(BOOL)flag;,并且需要数组中对象实现NSCopying协议,数组中对象最终是否深拷贝还要看该对象本身是否可变。

    相关文章

      网友评论

          本文标题:OC 数组mutableCopy能不能把数组里边的对象深拷贝?

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