深拷贝和浅拷贝

最近回忆了一下copy深拷贝和浅拷贝,这个比较简单的问题,代码和打印结果比文字更直观,直接上代码。

定义三个属性

@property (nonatomic, strong) NSArray *proArray;

@property (nonatomic, copy) NSArray *acopyProArray;

@property (nonatomic, copy) NSMutableArray *aMcopyProArray;

    NSArray *array = [NSArray arrayWithObjects:[NSMutableString stringWithFormat:@"111111"],[NSString stringWithFormat:@"222222"],[NSString stringWithFormat:@"333333"], nil];

    NSArray *copyArray = [array copy];

    NSMutableArray *mCopyArray = [array mutableCopy];

    [mCopyArray addObject:[NSString stringWithFormat:@"444444"]];

    self.proArray = array;

    self.acopyProArray = array;

    self.aMcopyProArray = array; // 警告,不可变数组赋值给可变数组

    NSMutableString *addString = [mCopyArray objectAtIndex:0];

    [addString appendString:@"90"];

    NSMutableArray *deepCopyArray = [[NSMutableArray alloc] initWithArray:array copyItems:YES];

//    NSMutableString *addDeepString = [deepCopyArray objectAtIndex:0];

//    [addDeepString appendString:@"100"];  crash,推断,深拷贝的item不是mutablecopy

    [deepCopyArray addObject:@"5555555"];

    NSLog(@"array = %p %@",array,array);

    NSLog(@"copyArray =%p %@",copyArray,copyArray);

    NSLog(@"mCopyArray =%p %@",mCopyArray,mCopyArray);

    NSLog(@"self.proArray =%p %@",self.proArray,self.proArray);

    NSLog(@"self.acopyProArray =%p %@",self.acopyProArray,self.acopyProArray);

    NSLog(@"aaaaaa =%p %@",deepCopyArray,deepCopyArray);

以上代码打印结果如图一:


深拷贝和浅拷贝_第1张图片
图1

简单总结下:

1、copy  后,指针不变

2、mutableCopy 后,指针变化,copy 了一份新的数据,但是每个元素和原数组里的共用。

3、属性 strong  和copy  ,都是赋值,未进行深拷贝。

4、如果需要将数组元素copy的话,那么用initWithArray: copyItems: 可以实现。

5、另外补充下,这个只拷贝一层,如果是多层嵌套的话,想将每层都copy一份的话,可以进行归档解、档来实现。(这里没实现, PS:如果元素是对象,那么需要对改类实现nscoding协议,才能归解档)

完毕。

你可能感兴趣的:(深拷贝和浅拷贝)