在我的应用程序中,我需要创建NSMutableArray
的副本。目前我正在使用mutableCopy
方法。但是当我修改复制的数组时,原始的数组也会被修改。请告诉我如何创建新副本NSMutableArray
。
这是代码
delegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];
self.mainImagesArray = [[NSMutableArray alloc]initWithArray:[delegate.arrayForCarCaptureImages mutableCopy]];
这里我正在修改
UIImage *filteredImage =[[[[self.mainImagesArray objectAtIndex:i]valueForKey:valueVheck] objectAtIndex:j] copy];
filteredImage =[filteredImage brightness:(1+sliderValue-0.5)];
[[[self.mainImagesArray objectAtIndex:i]valueForKey:valueVheck]removeObjectAtIndex:j];
[[[self.mainImagesArray objectAtIndex:i] valueForKey:valueVheck]insertObject:filteredImage atIndex:j];
执行后,arrayForCarCaptureImages也会自动修改。
答案 0 :(得分:3)
您需要创建一个深层副本。根据我的理解,您可以创建NSMutableArray本身的副本,而无需复制它的各个元素。
从我在您编写的代码中看到的内容:
- 您正在滥用委托模式
- 您的代码无法读取。尝试将它传递给另一个开发人员,我打赌你会很快被打耳光:)
醇>
以下是深度复制的典型案例:
NSArray *numbersArr = @[@1,@2,@3];
NSMutableArray *numbersArrCopy = [NSMutableArray array];
for (NSNumber *num in numbersArr) {
[numbersArrCopy addObject:[num copy]];
}
更简单的方法:
NSArray *numbersArr = @[@1,@2,@3];
NSArray *numbersArrCopy = [[NSArray alloc] initWithArray:numbersArr copyItems:YES];
这当然不同于:
NSArray *numbersArr = @[@1,@2,@3];
NSArray *numbersArrCopy = [numbersArr copy];
答案 1 :(得分:0)
你试过了吗?
NSArray *copiedArray = [[NSArray alloc] initWithArray:[otherArray copy]];
答案 2 :(得分:0)
在项目中尝试此代码:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];
NSMutableArray *copiedArray = [array mutableCopy];
[array addObject:@"four"];
NSLog(@"copied %@", copiedArray);
答案 3 :(得分:0)
MutableCopy不会执行深层复制。你必须按照给定的方式手动完成,
NSMutableArray *arrayCopy = [NSMutableArray array];
for (id element in arraySource)
[arrayCopy addObject:[element mutableCopy]]; //or [arrayCopy addObject:[element copy]];
答案 4 :(得分:0)
您的代码几乎无法读取。看看这是否有效
delegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.mainImagesArray = [[NSMutableArray alloc]initWithArray:delegate.mainImagesArray
copyItems:YES];
UIImage *filteredImage = self.mainImagesArray[i][valueVheck][j];
filteredImage = [filteredImage brightness:(1+sliderValue-0.5)];
[self.mainImagesArray[i][valueVheck]replaceObjectAtIndex:j
withObject:filteredImage];