1

ユーザーが画面上のポイントに触れたときに画面に画像を表示する一時変数名 imgView を保持する imgBall という名前の NSArray があります。

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

    UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 40, 40)];
    imgView.image = [UIImage imageNamed:@"ball.png"];
    [self.view addSubview:imgView];
    imgView.center = [myTouch locationInView:self.view];
    [imgBall addObject:imgView];
}

ユーザーは、画面上の任意の場所をタッチして、複数のインスタンスを作成できます。アレイ内の 5、10、または 20 個の異なるボールを意味する可能性があります。

今、画面を「クリア」して imgView のすべてのインスタンスを削除する必要があるボタンがあります。私は次のことを試しました:

 for (UIImageView *imgView in imgBall) {
    [self.view removeFromSuperview:imgView]; 
}

    for (UIImageView *imgView in imgBall) {
    [imgBall removeObject:imgView];
}

しかし、どちらも SIGABRT を生成し、例外をスローします。

Terminating app due to uncaught exception 'NSGenericException', reason: 
'*** Collection     <__NSArrayM: 0x735f4a0> was mutated while being enumerated.'

毎回SIGABRTをスローせずにこれを行うにはどうすればよいですか?

4

3 に答える 3

2

私はあなたが欲しいと思います:

for (UIImageView *imgView in imgBall) {
    [imgView removeFromSuperview]; 
    [imgBall removeObject:imgView];
}

また、touchesEnded で作成する場合は、[imgBall addObject:imgView] の後に [ imgView release] を行う必要があります。そうしないと、メモリ リークが発生します。

于 2012-07-18T19:14:39.783 に答える
1

あなたはこれを次のようにすべきです...

for (UIImageView *imgView in imgBall) {
    [imgView removeFromSuperview];
}
[imgBall removeAllObjects];
于 2012-07-18T19:23:00.127 に答える
1

このようにしてください:

for (UIImageView *imgView in imgBall)
{
[imgView removeFromSuperview];
}

そして、メモリの問題を避けるために、配列 imgBall を解放して nil に設定することを忘れないでください。NSMutableArray の場合は、removeAllObjects を呼び出すだけです。

于 2012-07-18T19:17:57.330 に答える