0

デバッグ ビルドを使用すると、私のプログラムは 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);
    }
}       

デバイスのリリース ビルドでは、ボールは動きません。代わりに、画面の下部に送信され、そこにとどまるようです。

提案/解決策/アイデアは大歓迎です。前もって感謝します!

4

1 に答える 1

0

リリース ビルドをデバイスにどのように取得していますか? それとも、アドホック ビルドのことですか?

どちらの場合でも、リリース ビルドを実行するときにコメント アウトされていると思われる #define または #ifdef コード ブロックはありますか?

もう 1 つの可能性は、NSAssert で実際のロジックを実行し、リリース ビルドでアサートをオフにすることです。アサートをオフにすると、そのアサート内のコードは呼び出されません。

于 2009-08-31T19:10:11.713 に答える