0

したがって、これはまったく意味がありません。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回以上行っています。

4

1 に答える 1

0

問題/クラッシュが意味をなさなかったのと同じように、修正もまったく意味がありません。私はコードをランダムに変更して、何かが機能するかどうかを確認し始めました。行を移動する:prevObject = cObjectループの最初に移動すると、問題が修正されました。これを行ってもロジックはまったく変わりませんでした...灘...違いはないはずです。それでも、そうしました。プログラミングが論理的だと言った人は誰ですか?動作するコードは次のとおりです。

- (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 {
        id cObject = nil;
        id prevObject;
        for (int i = toIndex; i <= fromIndex; i++){
            prevObject = cObject;
            cObject = [self objectAtIndex:i];
            [self replaceObjectAtIndex:i withObject:(i == toIndex) ? movingObject : prevObject];
        }
    }
}

だから、誰かが何が起こっているのかについてチャイムをしたいですか?

于 2012-11-06T15:34:17.543 に答える