2009-06-20 10 views
1

私は同じUIImageViewをすべてアニメーション化する複数のボタンを持つiPhone用のアプリケーションを作成しています。それはシミュレータでうまく動作します(実際にはすべてのアプリのように)が、デバイスになるとアニメーションはうまく再生されますが、アプリが終了するボタンを繰り返し押すことで終了します。これまでは2つのボタンを実装しています。彼らが押されたときに起こることがここにあります。 アプリ起動時に44 MBのRAMを利用できます。次に、アニメーションを開始する2つのボタンのうちの最初のボタンを押すと、使用可能なメモリが31になり、32まで上昇し、次に2番目のボタンを押すとメモリは9に下がり、次に24に上昇し、次に不思議に10までゆっくりと減少します。最初のボタンを押すと利用可能なメモリが14MBに上昇し、これらのボタンを繰り返し押すと、アプリのメモリが4〜3MBに落ちて終了します。器具には漏れはありません。ここに私のコードは誰でも私の記憶の問題が潜んでいる場所を見つけることができます。 (私はまだ2.2.1で開発しています。私が3.0にアップグレードすると、リンゴの開発者プログラムにまだ登録されていないため、デバイス上で自分のアプリケーションをテストすることができず、オンラインチュートリアル唯一の2.2.1で動作するデバイスへのアプリケーション)iPhone SDK:3.0ではimageNamedのキャッシュをクリアしていますか? 2.2.1はそうではありません!

@synthesize 123pig; 
    - (IBAction)startClick:(id)sender{ 
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick) userInfo:nil repeats:NO]; 

     123pig.animationImages = [NSArray arrayWithObjects: 
           [UIImage imageNamed: @"123pigapple0001.png"], 
           [UIImage imageNamed: @"123pigapple0002.png"], 
           [UIImage imageNamed: @"123pigapple0003.png"], 
           [UIImage imageNamed: @"123pigapple0004.png"], 
            [UIImage imageNamed: @"123pigapple0005.png"], 
            [UIImage imageNamed: @"123pigapple0006.png"], 
            [UIImage imageNamed: @"123pigapple0007.png"], 
            [UIImage imageNamed: @"123pigapple0008.png"], 
            [UIImage imageNamed: @"123pigapple0009.png"], 
            [UIImage imageNamed: @"123pigapple0010.png"], 
            [UIImage imageNamed: @"123pigapple0011.png"], 
            [UIImage imageNamed: @"123pigapple0013.png"], 
            [UIImage imageNamed: @"123pigapple0014.png"], 
            [UIImage imageNamed: @"123pigapple0015.png"], 
            [UIImage imageNamed: @"123pigapple0016.png"], 
            [UIImage imageNamed: @"123pigapple0017.png"], 
            [UIImage imageNamed: @"123pigapple0018.png"], 
            [UIImage imageNamed: @"123pigapple0019.png"], 
            [UIImage imageNamed: @"123pigapple0020.png"],nil]; 

     [123pig setAnimationRepeatCount:1]; 
     123pig.animationDuration =.7; 
     [123pig startAnimating]; 
} 

    - (void)tick{ 
    [self animatePig]; 
} 

    - (void)animatePig{ 

    UIImage *pigImage13=[UIImage imageNamed:@"123pigapple0020.png"]; 


    if(123pig.image == pigImage13) 
     123pig.image = pigImage13; 
    else 
     123pig.image = pigImage13; 






    } 
    - (IBAction)startClick1:(id)sender{ 
    animationTimer1 = [NSTimer scheduledTimerWithTimeInterval:(1.00/30.00) target:self selector:@selector(tick1) userInfo:nil repeats:NO]; 
     123pig.animationImages = [NSArray arrayWithObjects: 
           [UIImage imageNamed: @"123pig0015.png"], 
           [UIImage imageNamed: @"123pig0016.png"], 
           [UIImage imageNamed: @"123pig0017.png"], 
           [UIImage imageNamed: @"123pig0018.png"], 
           [UIImage imageNamed: @"123pig0019.png"], 
           [UIImage imageNamed: @"123pig0020.png"], 
           [UIImage imageNamed: @"123pig0021.png"], 
           [UIImage imageNamed: @"123pig0022.png"], 
           [UIImage imageNamed: @"123pig0023.png"], 
           [UIImage imageNamed: @"123pig0024.png"], 
           [UIImage imageNamed: @"123pig0025.png"], 
           [UIImage imageNamed: @"123pig0026.png"], 
           [UIImage imageNamed: @"123pig0027.png"], 
           [UIImage imageNamed: @"123pig0028.png"], 
           [UIImage imageNamed: @"123pig0029.png"], 
           [UIImage imageNamed: @"123pig0030.png"], 
           [UIImage imageNamed: @"123pig0031.png"], 
           [UIImage imageNamed: @"123pig0032.png"], 
           [UIImage imageNamed: @"123pig0033.png"], 
           [UIImage imageNamed: @"123pig0034.png"], 
           [UIImage imageNamed: @"123pig0035.png"], 
           [UIImage imageNamed: @"123pig0036.png"], 
           [UIImage imageNamed: @"123pig0037.png"], 
           [UIImage imageNamed: @"123pig0038.png"], 
           [UIImage imageNamed: @"123pig0039.png"], 
           [UIImage imageNamed: @"123pig0040.png"], 
           [UIImage imageNamed: @"123pig0041.png"], 
           [UIImage imageNamed: @"123pig0042.png"], 
           [UIImage imageNamed: @"123pig0043.png"], 
           [UIImage imageNamed: @"123pig0044.png"], 
           [UIImage imageNamed: @"123pig0045.png"], 
           [UIImage imageNamed: @"123pig0046.png"], 
           [UIImage imageNamed: @"123pig0047.png"], 
           [UIImage imageNamed: @"123pig0048.png"], 

           nil]; 

    [123pig setAnimationRepeatCount:1]; 
    123pig.animationDuration =2.7; 
    [123pig startAnimating]; 


     } 
    - (void)tick1{ 
     [self animatePig1]; 
    } 

    - (void) animatePig1{ 

     UIImage *pigImage11=[UIImage imageNamed:@"123pig0048.png"]; 


     if(123pig.image == pigImage11) 
      123pig.image = pigImage11; 
     else 
      123pig.image = pigImage11; 






    } 
    - (void)stopTimer 
    { 
    [animationTimer invalidate]; 
    [animationTimer release]; 
    [animationTimer1 invalidate]; 
    [animationTimer1 release]; 
    } 







    -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 
    123pig.center = location; 
    } 

    - (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    } 



    - (void)dealloc { 
    [super dealloc]; 
    [123pig release]; 
    } 
@end 

私はそれはそれを引き起こしてthatsのimageNamedだという考えを持っており、その2.2.1が明確にそれがSOにもメモリの警告後に、別のキャッシュだしません私の理解は、+ imageNamed:キャッシュがiPhone OS 3.0でメモリ警告を尊重しなければならないということです。チャンスが訪れたときにテストしてください。今私が3.0のファームウェアとSDKをダウンロードしたとしても、それがデバイス上でテストすることができないので、imageNamedのキャッシュをクリアしていたかどうかわかりません!私がiPhone SDKの新機能であることを心に留めておくとBTW。前もって感謝します。

----------------編集---------------- 私はちょうどアップルのiPhoneデベロッパープログラムに参加しました。 WOOOHOOO、3.0がキャッシュされたイメージを適切にリリースしたかどうか確認します。

-------------編集------------------ はい、キャッシュされたイメージを解放します。さらに明確にするために私の答えをチェックしてください。

答えて

1

よろしくお願いします。iPhone OS 3.0が受信メモリ警告コマンドでキャッシュされた画像をクリアしているようです。 Me 1、Xcode 0.もう少し詳しく:iPhoneの2.2.1では、アニメーション化された画像ビューをリリースすると、キャッシュされた画像は解放されないため、アプリに多数のアニメーションがあると、メモリと終了します。だから、他のより複雑なアニメーションの方法に入るだけで、それを避けることができれば誰もそれをやりたくはありません。しかし、今リリースはキャッシュをクリアします!アニメーションが再生されるまで少し待ってから、もう一度押すと待機しない(キャッシュしているので)ので、別のボタンを押すとそのビューをアニメートすると、以前にキャッシュされたアニメーションがリリースされます。最初のボタンを押すと元の状態に戻りますので、私は今リラックスして、リンゴの障害であるメモリ管理の問題を修正しようとするのではなく、開発に乗り出すことができます。

+0

解除コードが正しくないため、UIImageViewを解放しないという副作用があります。 – Jason

0

私はあなたのタイマーの動作について本当に混乱しています。あなたはブタUIImageViewのアニメーションを開始し、1/30秒後にタイマーが起動し、ブタの画像が何かに設定されますか?

アニメーションの2つの方法(UIImageViewアニメーションイメージとタイマーを使用した手動アニメーション)を統合することができます。 UIImageViewは実際に長いアニメーションを再生することを目的としていません(this question参照)。アニメーションを開始するとすぐにすべての画像をプリロードすると思います。

もっと良い方法は、すべてのためにタイマーを使用し、現在のフレームに対応するローカル変数を保持することです。あなたのタイマーが起動すると、imageNamed:を使用して1つの画像だけを読み込んでUIImageViewに適用できます。私はUIImageのキャッシング動作が何であるか分かりませんが、UIImageViewに100を重ねることは悪い考えです。

アニメーションのフレームレートを下げる可能性はありますか?あなたは豚のアニメーションの100枚の画像をすべて2.7秒で反転しようとしているようです。これは37fpsです!おそらく24fpsであれば、メモリの使用量を減らすのに役立ちます。

また、これは話題にはなりませんが、dealloc関数で[123pig dealloc]を呼び出していることに気付きました。一般に、releaseを呼び出すだけで、オブジェクトの保持カウントがゼロ(オブジェクトがもはや使用されていないことを意味する)であれば、自動的にdeallocが呼び出されます。手動で呼び出すと、アプリ内の別のオブジェクトがまだ使用しているものを破壊する可能性があります。おそらくこの場合は問題になりませんが、他のシナリオではいくつかの厄介なバグを引き起こす可能性があります。

申し訳ありません申し訳ありませんが、キャッシュの問題について明確な回答はありません。それは少し助けてほしい!

+0

参考にしていただきありがとうございますが、明確にするために、コードの一部をコメントアウトしても無意味ですが、実際にはそこに表示されているフレームの量だけをアニメーション表示しています。タイマーを使用してアニメーションの最後のフレームをイメージビューのイメージに設定する方法で、100個のイメージをアニメーション化するという私の元の計画でしたが、今はそうではありません。そして、それは動作するようです。 – Amanda

0

deallocコードが正しくありません。割り当てを解除するのではなく、123pigを公開してください。呼び出し後に[super dealloc]を呼び出す前に実行する必要があります。そのため、すべてのインスタンス変数(incling 123pig)が無効になる可能性があります。これは、123pigへの参照がありませんので、イメージメモリを解放しないと明らかになっているかもしれません。

+0

はい、私は別のメンバーによって既に言われました、私はそれに応じて私のコードを編集し、それは問題であることが判明しませんでした。 imageNamedはメモリ警告の後でもキャッシュされたイメージを解放しないため、問題を引き起こしていました。 – Amanda

関連する問題