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

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 に答える
0

やってみました:

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