инструмент xcode для поиска проблем с памятью, доступ к указателю на местоположение другой переменной ecc - PullRequest
1 голос
/ 19 апреля 2011

Я использую cocos2d, однако вопрос общий. у меня есть класс

CCNode *scaleLayer

в событии touchesMoved, которое я установил

scaleLayer.scale=(some calculation)

если я скомпилирую в устройстве, программа вылетает, на симуляторе работает хорошо. если я поставлю nslogs перед инструкцией прецедента, хорошо работает даже в устройстве. может быть какая-то память, указатель или что это может быть? Тем не менее, существует инструмент XCode, который может заставить меня найти или понять, куда направить мой взгляд? спасибо

вот код:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];
//NSLog(@"comincio");
switch ([allTouches count]) {
    case 2: { //Double Touch
        UITouch *t1 = [[allTouches allObjects] objectAtIndex:0];
        UITouch *t2 = [[allTouches allObjects] objectAtIndex:1];
        CGPoint p1=[self convertTouchToNodeSpace: t1];
        CGPoint p2=[self convertTouchToNodeSpace: t2];                  

        initialDistance = [self distanceBetweenTwoPoints:p1 B:p2];
        oldScale=scaleLayer.scale;
        NSLog(@"distanza iniz %f",initialDistance);
    } break;
            default:
        break;
}
}

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint location;   
    UITouch *t1,*t2;    
    CGPoint p1,p2;

    NSSet *allTouces=[event allTouches];
    switch ([allTouces count]) {
case 2:
            //NSLog(@"2 tocchi");
            t1=[[allTouces allObjects] objectAtIndex:0];
            t2=[[allTouces allObjects] objectAtIndex:1];
            p1=[self convertTouchToNodeSpace: t1];
            p2=[self convertTouchToNodeSpace: t2];
            CGFloat finalDistance=[self distanceBetweenTwoPoints:p1 B:p2];
//if i put here NSLog("%f %f %f",oldScale,finalDistance,initialDistance); all goes well
            scaleLayer.scale=oldScale*finalDistance/initialDistance;
            NSLog(@"scala %f",scaleLayer.scale);//finalDistance/initialDistance);
//this nslog give me error if i not put that nslog before
            break;

        default:
            break;
    }
}

-(CGFloat)distanceBetweenTwoPoints:(CGPoint)A B:(CGPoint)B{
    float x=B.x-A.x;
    float y=B.y-A.y;
    return sqrt(x*x+y*y);
}

Ответы [ 2 ]

0 голосов
/ 19 апреля 2011

Один из вариантов, который вы можете использовать, это зомби , это уже объяснено в stackoverflow, поэтому я не собираюсь делать это здесь.

Но если вы получаете ошибки типа EXC_BAD_ACCESS, вы можете добавить точку останова исключения. Это также иногда помогает. Вот шаги для этого

  1. В левом нижнем углу навигатора точки останова нажмите плюс кнопка.
  2. Во всплывающем окне выберите «Добавить точку останова исключения»
  3. Выберите тип исключения. Я обычно выбираю исключение «Все»
  4. Клик готов.

Apple объяснила это здесь .

0 голосов
/ 19 апреля 2011

Попробуйте построить с помощью статического анализатора (Shift-Command-A)

Попробуйте посмотреть адрес памяти. Вот несколько ссылок для начала: scottmpeak.com и ТАК обсуждение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...