1

画像をランダムに引っ張るゲームを構築しています。いくつかのテストを行った後、同じイメージが 2 回呼び出されるとクラッシュすることがわかりました。最初のゲームを完了した後、ゲームのメイン メニューに戻り、もう一度プレイすることを選択して、これを学びました。以前のゲームで既に表示されていた画像を取得してしまい、1 秒後にアプリがクラッシュしました。テストを行ったところ、最初のゲームで同じ画像が 2 回表示され、2 回目に画像が表示された 1 秒後にクラッシュしました。

これがサンプルコードです。「idNum」と「timer」は .h ファイルで宣言されているため、グローバルです。ご覧のとおり、プルする新しいイメージをランダム化するために毎秒実行される NSTimer があります。画像が 2 回目に表示されるまで、検索は機能します。1,3,2,5,3 のランダムな順序を取得するとします。2 番目の 3 でクラッシュします。

画像を 2 回呼び出すことはできませんか? これはキャッシュの問題だとしか思えません。画像キャッシュを解放する方法がわかりません。エラー objc_msgSend が表示されます。クラッシュのデバッグが苦手で申し訳ありません。

//idNum = the randomly generated integer
//pictures are called by numbers ex(1.jpg, 5.jpg)



timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeCounter) userInfo:nil repeats:YES];


-(void)timeCounter {
time = time + 1;

    idNum = (arc4random() % 5);

    NSString * imgIDnum = [[NSString alloc] initWithFormat:@"%d", idNum];
    imgMain = [NSString stringWithFormat:@"%@%@", imgIDnum, @".jpg"];
    [imgIDnum release];

    UIImage * daImg = [UIImage imageNamed:imgMain];
    [imgView setImage:daImg];



  }
4

2 に答える 2

0

申し訳ありませんが、問題を修正しましたが、その方法がわかりません。私はそのコードの大部分を書き直し、いくつかのスニペットを追加、削除、および変更して、よりメモリ管理に適したものにしました。もう一度実行したところ、問題はまったくありませんでした。解決策がなくてすみません。他の誰かがこの問題に遭遇した場合は、私が助けようとすることを知らせてください。

于 2009-09-03T23:21:38.503 に答える
0

クラッシュに関する詳細情報を提供する必要があります。それは+imageNamed:上記の行にありますか、それともおそらくにあり-setImage:ますか?

最も可能性の高い原因は、UIImage. たとえば、上記のコードの後に​​呼び出すと、クラスがキャッシュ[daImg release]している何かを過剰に解放するため、この動作が発生します。UIImageあなたが説明する状況まで、これはクラッシュを引き起こしません。

私はこのバグの非常に面白いバージョンを見てきました: 私のチームメイトは NSNumber を過剰にリリースしていました (ほとんどの場合、整数 2 でした)。NSNumber は内部的にキャッシュされるため、次に整数 2 の NSNumber を作成すると、プログラムの無関係な部分でクラッシュします。他の数字でも問題ありませんでしたがNSLog()、2 を試してみてください。

于 2009-09-02T22:11:23.370 に答える