最近回忆了一下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、copy 后,指针不变
2、mutableCopy 后,指针变化,copy 了一份新的数据,但是每个元素和原数组里的共用。
3、属性 strong 和copy ,都是赋值,未进行深拷贝。
4、如果需要将数组元素copy的话,那么用initWithArray: copyItems: 可以实现。
5、另外补充下,这个只拷贝一层,如果是多层嵌套的话,想将每层都copy一份的话,可以进行归档解、档来实现。(这里没实现, PS:如果元素是对象,那么需要对改类实现nscoding协议,才能归解档)
完毕。
网友评论