Сборка релиза iPhone не функционирует так же, как сборка отладки - PullRequest
0 голосов
/ 31 августа 2009

Моя программа работает так, как я хочу, как на симуляторе iPhone, так и на самом iPhone при использовании отладочной сборки. Однако, когда я изменяю его на сборку релиза, он работает на симуляторе iPhone, но не на устройстве. Я пытаюсь анимировать шарик по экрану с помощью таймера, и шарик должен отскакивать от боков, если он сталкивается с краями экрана. Это прекрасно работает для отладочных сборок, но сборка выпуска работает только на симуляторе, а не на устройстве. Мяч даже не движется на устройстве с релизом билда.

У меня такое ощущение, что это связано с уровнем оптимизации, который изменяется при переключении с отладки на сборку релиза. Если это правда, как я могу изменить свой код, чтобы он лучше соответствовал уровню оптимизации?

Контроллер представления вызывается с initWithNibName: который содержит:

CGRect ballRect = CGRectMake(133, 424, 55, 56); 
newBall = [[Ball alloc] initWithFrame: ballRect];
[self.view addSubview: newBall];
[self setImage: [UIImage imageNamed: @"Red.png"]];

Ball * newBall был объявлен в файле интерфейса. Мяч правильно отображается на экране с правильным изображением во всех билдах.

Таймер для перемещения мяча вызывается, когда пользователь нажимает на экран:

-(void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event{
    touch = [touches anyObject];
    touchPoint = [touch locationInView: self.view];
    dx = touchPoint.x - newBall.center.x;
    dy = touchPoint.y - newBall.center.y;
    newBallTimer = [NSTimer scheduledTimerWithTimeInterval: 1.0/50.0 target: self selector: @selector(moveBall) userInfo: nil repeats: YES];
}

CGPoint TouchPoint, UITouch * touch, float dx, float dy и NSTimer * newBallTimer также были объявлены в файле интерфейса.

Вот мой код для перемещения мяча и обнаружения столкновений:

-(void) moveBall
{       
    newBall.center = CGPointMake( newBall.center.x + dx, newBall.center.y + dy );

    // left boundary
    if( newBall.frame.origin.x <= 20 )
    {
        dx = abs(dx);
    }   
    else if( newBall.center.x >= 280 )  
    {
        dx = -abs(dx);
    }
}       

В сборке релиза на устройстве мяч не двигается. Вместо этого он, кажется, отправляется в нижнюю часть экрана и остается там.

Любые предложения / решения / идеи высоко ценятся. Заранее спасибо!

1 Ответ

0 голосов
/ 31 августа 2009

Как вы получаете сборку релиза на ваше устройство? Или вы имеете в виду специальную сборку?

В любом случае, есть ли у вас какие-либо блоки кода #define или #ifdef, которые, возможно, комментируются при сборке релиза?

Еще одна возможность - выполнить реальную логику в NSAssert, а затем отключить утверждения в сборке выпуска. При отключении утверждений любой код в этом утверждении не будет вызываться.

...