2013-07-19 2 views
0

Мне нужна помощь в понимании того, как использовать инструменты отладки. Предыдущие сообщения в этой теме предлагают использовать NSZombie и устанавливать точки останова. Они не работают для меня, а это значит, что я не понимаю, как правильно их использовать - или как интерпретировать то, что они говорят мне.указатель, освобождаемый, не был выделен - как отлаживать в объекте Xcode c?

(я работает в вакууме, в основном - не один в моем рабочем месте или круг общения не делает Objective 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]; 

} 

код прекрасно работает в течение первых двух сотен итераций или поэтому, а затем происходит сбой и ошибка: освобожденный указатель не был выделен.

Любые хорошие указатели на то, как интерпретировать вывод из инструментов или любой другой методологии отладки, были бы большой помощью для меня, и я уверен, что для других тоже есть. Большое спасибо заранее ...

Tim Редфилд

ответ

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, толкает данные. Я все еще пытаюсь обвести вокруг себя эту голову. Комментарии приветствуются!

Смежные вопросы