一. 数组深拷贝,数组中对象不实现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
协议,数组中对象最终是否深拷贝还要看该对象本身是否可变。
网友评论