1

デバッグ ツールの使用方法を理解するための助けが必要です。このトピックに関する以前の投稿では、NSZombie の使用とブレークポイントの設定が提案されています。これらは私にとってはうまくいきません。つまり、それらを適切に使用する方法、またはそれらが私に言っていることを解釈する方法がわかりません。

(基本的に、私は孤立した環境で活動しています -- 私の職場や社交界では、客観的な C プログラミングを行う人は誰もいません...)

これが問題のコードです。私の考えは、100 個のオブジェクトの移動配列を作成することです。ルーチン motionDataArray は、motionManager の startDeviceMotionUpdatesUsingReferenceFrame メソッドによって呼び出されます。配列に値が入力され、その長さが 100 に達すると、最初のオブジェクトが削除されるため、配列には常に 100 個のオブジェクトしか存在しません。このようにして、データの平均を取り、多くのノイズを取り除くことができると思います。

(おそらくこの目標を達成するためのより良い方法があると思いますが、ここに私が思いついたものがあります...)

- (void) motionDataArray: (CMCalibratedMagneticField) field
{
    NSDictionary *motionData = [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithDouble: motionManager.deviceMotion.gravity.x],@"gravity_x",                                            
        [NSNumber numberWithDouble: motionManager.deviceMotion.gravity.y],@"gravity_y",
        [NSNumber numberWithDouble: motionManager.deviceMotion.gravity.z],@"gravity_z",
        [NSNumber numberWithDouble: field.field.x],@"mag_x",
        [NSNumber numberWithDouble: field.field.y],@"mag_y",
        [NSNumber numberWithDouble: field.field.z],@"mag_z",
        [NSNumber numberWithDouble: `enter code here`locationManager.heading.magneticHeading],@"mag_heading",
        [NSNumber numberWithDouble: motionManager.deviceMotion.attitude.roll],@"roll",
        [NSNumber numberWithDouble: motionManager.deviceMotion.attitude.yaw],@"yaw",
        [NSNumber numberWithDouble: motionManager.deviceMotion.attitude.pitch],@"roll",
        nil];


        //NSLog(@"%d",[motionArray count]);


        if([timerArray count] > arrayCount - 1)
        {
            int i = [timerArray count] - arrayCount;
            for (int j = 0; j < i + 1; j++)
            {
               [motionArray removeObjectAtIndex:0]; 
            }
        }


    [motionArray addObject:motionData];

}

コードは最初の 200 回程度の反復で正常に実行され、その後クラッシュしてエラーが発生します。解放されているポインターが割り当てられていません。

Instrumentsまたはその他のデバッグ方法からの出力を解釈する方法についての良い指針は、私にとって大きな助けになるでしょう。よろしくお願いします...

ティム・レッドフィールド

4

1 に答える 1

0

OK、解決策があると思います。クラッシュせずに実行され、アレイは最大 100 のままです。しかし、なぜそれが機能するのかよくわかりません。次のように @synchronize を使用しない限り、配列からオブジェクトを削除することはできないようです。

if([timerArray count] > arrayCount - 1)
{
    int i = [timerArray count] - arrayCount;
    for (int j = 0; j < i + 1; j++)
    {
        @synchronized(timerArray) {
            [timerArray removeObjectAtIndex:0];
        }
    }
}

これは、割り当てられる前にオブジェクトが削除された配列に関係していると思います。これは、motionManager がデータをプッシュしているのと同じ速度でコード ループが実行されているとは限らないために発生するようです。私はまだこれに頭を悩ませようとしています。コメント大歓迎!

于 2013-07-20T15:23:51.557 に答える