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];

}

代码在前两百次左右的迭代中运行良好,然后出现崩溃和错误:未分配被释放的指针。

任何关于如何解释 Instruments 或任何其他调试方法的输出的好的指示都会对我有很大帮助,我相信对其他人来说也是如此。提前谢谢了...

蒂姆·雷德菲尔德

4

1 回答 1

0

好的,我想我有一个解决方案——它运行时不会崩溃,并且阵列保持在 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 回答