如何为NSMutableArray创建单独的实例

时间:2013-05-02 08:43:02

标签: iphone ios nsmutablearray

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

5 个答案:

答案 0 :(得分:3)

您需要创建一个深层副本。根据我的理解,您可以创建NSMutableArray本身的副本,而无需复制它的各个元素。

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

  
      
  1. 您正在滥用委托模式
  2.   
  3. 您的代码无法读取。尝试将它传递给另一个开发人员,我打赌你会很快被打耳光:)
  4.   

以下是深度复制的典型案例:

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];