1

iPhoneアプリのviewDidLoadメソッドには、次のコードがあります。

zombie[i].animationImages = zombieImages;
        zombie[i].animationDuration = 0.8/zombieSpeed[i];
        zombie[i].animationRepeatCount = -1; 
        [zombie[i] startAnimating];

後でアプリで次のコードが呼び出されます。

[zombie[i] stopAnimating];
                zombie[i] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"zh.png"]];
                zombie[i].animationImages = flyingZombieImages;
                zombie[i].animationDuration = 0.8/zombieSpeed[i];
                zombie[i].animationRepeatCount = -1; 
                [zombie[i] startAnimating];

これにより、アプリがクラッシュし、EXC_BAD_ACCESSが回線に接続されますzombie[i].animationImages = flyingZombieImages;

flyingZombieImages次のコードで初期化されます:(zombieImages同じ方法で初期化されます)

NSMutableArray *flyingZombieImages = [NSMutableArray array];
    for (NSUInteger i=1; i <= 29; i++) {
        NSString *imageName = [NSString stringWithFormat:@"flzom%d.png", i];
        [flyingZombieImages addObject:[UIImage imageNamed:imageName]];
    }

なぜこうなった?回避策はありますか?

4

1 に答える 1

1

Dima が述べたように、flyingZombieImages は適切に初期化されていない可能性が高く、クラッシュの原因となっています。ただし、UIImageView の新しいインスタンスを作成する場合、別の問題もあります。

zombie[i] = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"zh.png"]];

この時点で、この変数に格納されている古い UIImageView への参照が既にあります。あなたはそれへの参照を失い、おそらくそのメモリをリークします。ビュー階層から古い UIImageView を削除し、新しいものを追加することもできます。

より良い方法は、代わりに元の UIImageView を使用し、この行を次のように置き換えてイメージを変更することです。

zombie[i].image = [UIImage imageNamed:@"zh.png"];
于 2012-07-01T19:35:06.843 に答える