0

在我的应用程序中,我需要创建一个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 也会自动修改。

4

5 回答 5

3

您需要创建一个深层副本。据我了解,您正在创建 NSMutableArray 本身的副本,而不复制它的各个元素。

根据我在您编写的代码中看到的内容:

  1. 您正在滥用委托模式
  2. 您的代码不可读。试着把它传给另一个开发者,我敢打赌你会很快被扇耳光:)

下面是一个典型的深度复制案例:

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];
于 2013-05-02T08:45:07.963 回答
0

你有没有尝试过:

NSArray *copiedArray = [[NSArray alloc] initWithArray:[otherArray copy]];
于 2013-05-02T08:45:18.503 回答
0

在您的项目中尝试此代码:

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"one", @"two", @"three", nil];

NSMutableArray *copiedArray = [array mutableCopy];


[array addObject:@"four"];
NSLog(@"copied %@", copiedArray);
于 2013-05-02T09:04:07.777 回答
0

MutableCopy 不会执行深拷贝。您必须按照给定的方式手动完成,

NSMutableArray *arrayCopy = [NSMutableArray array];
for (id element in arraySource)
    [arrayCopy addObject:[element mutableCopy]]; //or [arrayCopy addObject:[element copy]];
于 2013-05-02T09:46:49.810 回答
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];
于 2013-05-02T10:00:53.157 回答