2013-07-19 7 views
0

디버깅 도구를 사용하는 방법을 이해하는 데 도움이 필요합니다.이 주제에 대한 이전 게시물은 NSZombie 사용 및 중단 점 설정을 제안합니다. 이것들은 저를 위해 작동하지 않습니다, 나는 그들을 올바르게 사용하는 방법을 이해하지 못함을 의미합니다 - 또는 그들이 말하는 것을 해석하는 방법. 해제 된 포인터가 할당되지 않았습니다. 어떻게 Xcode objective c에서 디버그합니까?

는 (나는 기본적으로, 진공에서 운영하고있어 - 내 직장이나 사회 원에 아무도 객관적인 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]; 

} 

코드는 처음 이백 반복 또는 벌금 실행 그래서 충돌과 오류가 발생합니다 : 해제 된 포인터가 할당되지 않았습니다.

인스 트루먼 트의 출력이나 다른 디버깅 방법론을 해석하는 방법에 대한 좋은 지침은 나에게 큰 도움이 될 것입니다. 그것은 충돌없이 실행하고, 배열은 100를 최대로 유지 - 많은 사전에 감사 ...

팀 레드 필드

답변

0

확인, 나는 해결책을 가지고 생각합니다. 그러나, 나는 그것이 작동하는 이유를 정말로 이해하지 못한다. 그것은 @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가 데이터를 밀어 넣는 것과 동일한 속도로 실행되지는 않기 때문입니다. 나는 아직도 이것에 대해 내 머리를 싸려고 노력하고있다. 코멘트 환영!

관련 문제