したがって、これはまったく意味がありません。NSMutableArray
あるインデックスから別のインデックスにアイテムを移動するための拡張メソッドがあります。これは非常に単純な方法であり、デバッグ構成でアプリをコンパイルすると問題なく機能します。ただし、リリース構成でアプリをコンパイルすると、アイテムから下に移動すると(インデックス>からインデックスに)クラッシュします。クラッシュは、インデックスの範囲外エラーではありません。ローカル変数がめちゃくちゃになっていて、その理由がわかりません。全体の方法は次のとおりです。
- (void) moveObjectAtIndex:(NSUInteger)fromIndex toIndex:(NSUInteger)toIndex{
if (fromIndex == toIndex) return;
if (fromIndex >= self.count) return;
if (toIndex >= self.count) toIndex = self.count - 1; //toIndex too large, assume a move to end
id movingObject = [self objectAtIndex:fromIndex];
if (fromIndex < toIndex){
for (int i = fromIndex; i <= toIndex; i++){
[self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : [self objectAtIndex:i + 1]];
}
} else {
//The problem occurs in this block (though the crash doesn't always occur here)
id cObject;
id prevObject;
for (int i = toIndex; i <= fromIndex; i++){
//usually on the last loop, my "prevObject" become 'messed up' after the following line:
cObject = [self objectAtIndex:i];
[self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : prevObject];
prevObject = cObject;
}
}
}
リリースビルドであるため、コードをステップスルーすることはできませんが、ループの各ステップで変数をNSLoggedしました。通常、最後のループで、変数は完了prevObject
時に確率変数を割り当てられますcObject = [self objectAtIndex:i];
。設定されている場合もありnil
ますが、コード内の他の確率変数である場合もあります。nil
配列内のオブジェクトを置き換えようとすると、コードがクラッシュする場合。そうしないと、後で配列にアクセスして間違ったオブジェクトを受信しようとしたときにクラッシュします。
誰かが何が起こっているのか分かりますか?つまり、問題は4行のコードで発生しています。これは私が100回以上行っています。