需求:一個(gè)對(duì)象數(shù)組,然后想將這個(gè)數(shù)組拷貝出來(lái)一份用,修改拷貝的這份數(shù)組,保持原始數(shù)據(jù)不被改變.
我自己的理解:
copy和mutableCopy的區(qū)別在于絮重,后者拷貝出來(lái)的對(duì)象是可變對(duì)象惋啃,沒(méi)有別的差別
需要實(shí)現(xiàn)NSCopying或者NSMutableCopying協(xié)議
(NSMutableArray,NSArray,NSString等實(shí)現(xiàn)了該協(xié)議)
協(xié)議對(duì)應(yīng)方法:
- (id)copyWithZone:(nullable NSZone *)zone
- (id)mutableCopyWithZone:(nullable NSZone *)zone
舉例:
實(shí)現(xiàn) NSCopying,NSMutableCopying 協(xié)議如果用NSCopying
實(shí)現(xiàn):
- (id)copyWithZone:(nullable NSZone *)zone
如果用NSMutableCopying
實(shí)現(xiàn):
- (id)mutableCopyWithZone:(nullable NSZone *)zone
@interface Model : NSObject<NSCopying,NSMutableCopying>
@property (nonatomic, copy) NSString *str1;
@property (nonatomic, copy) NSString *str2;
@end
@implementation Model
- (id)copyWithZone:(nullable NSZone *)zone{
Model *model1 = [[self class] allocWithZone:zone];
model1.str1 = [_str1 copy];
model1.str2 = [_str2 copy];
return model1;
}
- (id)mutableCopyWithZone:(nullable NSZone *)zone{
Model * model = [[self class] allocWithZone:zone];
model.str1 = [_str1 copy];
model.str2 = [_str2 copy];
return person;
}
@end
實(shí)現(xiàn)了協(xié)議以后,那么該對(duì)象就可以進(jìn)行拷貝了,下面說(shuō)說(shuō)數(shù)組是怎么回事
//構(gòu)造一個(gè)Model 數(shù)組
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i< 3; i++) {
Model *model = [[Model alloc] init];
model.str1 = @"1";
model.str2 = @"2";
NSLog(@"數(shù)組%d:---%p",i,model);
[arr addObject:model];
}
那么我想拷貝數(shù)組對(duì)象,直接NSMutableArray *arr1 = [arr mutableCopy];
是不是這樣就可以了arr
內(nèi)存地址:0x7f8d8b7972a0arr1
內(nèi)存地址:0x7f8d8b796fe0
顯然是不一樣的,那么你會(huì)說(shuō)這樣就可以了,其實(shí)你想多了,斷點(diǎn)后看兩個(gè)數(shù)組的元素的地址改變了沒(méi)有:
結(jié)果:
po arr<__NSArrayM 0x7f8d8b7972a0>
(<Model: 0x7f8d8b78f110>,<Model: 0x7f8d8b52b470>,<Model: 0x7f8d8b408830>)
po arr1<__NSArrayM 0x7f8d8b796fe0>
(<Model: 0x7f8d8b78f110>,<Model: 0x7f8d8b52b470>,<Model: 0x7f8d8b408830>)
元素對(duì)象是一樣的,地址完全一樣,所以說(shuō)數(shù)組的指針變了,但是數(shù)組元素是沒(méi)有變的,該如何解決呢?下面這種方式可以是一種解決辦法.
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i< 3; i++) {
Model *model = [[Model alloc] init];
model.str1 = @"1";
model.str2 = @"2";
NSLog(@"數(shù)組%d:---%p",i,model);
[arr addObject:model];}NSMutableArray *arr1 = [NSMutableArray array];
for (Model *model in arr)
{
[arr1 addObject:[model copy]];
}
//這里的copy,就是將arr數(shù)組里的每一個(gè)對(duì)象拷貝一份.//所以Model對(duì)象實(shí)現(xiàn)
- (id)copyWithZone:(nullable NSZone *)zone方法
蘋(píng)果提供了數(shù)組元素的拷貝方法
解決方法
[[NSMutableArray alloc] initWithArray:arr1 copyItems:YES]