1

ユーザーが描画したときにパスが保存され、ユーザーがアプリを閉じて再度開いたときに読み込まれる描画アプリがあります。

オブジェクト(ブラシの色)をNSMutableArrayに追加し、次のように保存します。

// Adding object to NSMutableArray (this is in touchesMoved)
NSData *colorData = [NSKeyedArchiver archivedDataWithRootObject:self.brushColor];
[self.brushColours addObject:colorData];

// Saving array (this is in touchesEnded)
[defaults setObject:self.brushColours forKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
[defaults synchronize];

それはすべて問題なくダンディですが、パスをロードして色を設定しようとすると、次のようになります。

なぜこうなった?

編集:私はこのように色をロードし直しています(これは各パスのforループにあります):

NSMutableArray *arr3 = [defaults objectForKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex:index]];
4

1 に答える 1

2

indexはnewpathsのオブジェクトパスのインデックスですが、このインデックスを使用して、newpathsではなくarr3のオブジェクトにアクセスしています。newpaths配列の長さが同じかarr3であるかどうかを確認してください。それを行う前に、いくつかのアサーションを実行します。

NSAssert([arr3 count]>=[newpaths count], @"newpaths is longer than arr2");

これはループの前です。例外が言うように、ループ内のarr3配列を何らかの方法で変更しない限り、インデックスはarr3の範囲外であるため、おそらくこのアサーションは当てはまりません。
その要素にアクセスする前にarr3をテストします。

NSAssert(index<[arr3 count], @"Index out of bounds");
NSMutableArray *arr3 = [defaults objectForKey:[NSString stringWithFormat:@"%@BrushColours%@", currentid, pageno]];
self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex:index]];

確かにアサーションは失敗し、何が悪いのかをより正確に(完全に正確にではなく)知ることができます。もう一度調査することで、バグの理由を知ることができます(これを単独で達成できない場合は、さらにコードを投稿してください)。

編集

別の解決策:何をしようとしているのかは明確ではありませんが、arr3でそのオブジェクトを見つけて、アーカイブを解除したいと思います。
したがって、indexOfObjectを使用できます。

id obj= [newpaths objectAtIndex: index];
NSUInteger validIndex=[arr3 indexOfObject: obj];
if(validIndex!= NSNotFound)
    self.brushColor = [NSKeyedUnarchiver unarchiveObjectWithData:[arr3 objectAtIndex: validIndex]];

PS:とにかく、オブジェクトの結果が等しい(isEqualメソッド)場合を除いて、objを直接アーカイブ解除できますが、比較後にオブジェクトの状態を変更しました。

于 2012-11-09T21:09:52.233 に答える