1

他の多くのビューを含む「host」というUIViewがあります。ホストはglViewのサブビューです。また、ホストはインスタンス変数です。だから私は次の方法があります:

-(void) doCancel:(id)sender {
    ANNOUNCE
    X.messageIsShowing = NO;
    CGFloat fadeOutTime = 0.4f;
    [UIView animateWithDuration:fadeOutTime animations:^{ 
        host.alpha = 0.f; 
    } completion:^(BOOL finished){
        [host removeFromSuperview];
        [host release];
    }];
}

ホストビューをフェードアウトしてから、スーパービューから削除することになっています。数週間は機能していましたが、「[hostremoveFromSuperview];」の行でEXC_BAD_ACCESSを使用してクラッシュしています。それが機能したので私は多くのものを変更しましたが、私が知る限り、この方法では何も変更しませんでした。

ログステートメントを追加したので、次のようになります。

-(void) doCancel:(id)sender {
    ANNOUNCE
    X.messageIsShowing = NO;
    CGFloat fadeOutTime = 0.4f;
    CCLOG(@"host.alpha: %f", host.alpha);
    [UIView animateWithDuration:fadeOutTime animations:^{ 
        host.alpha = 0.f; 
    } completion:^(BOOL finished){
        CCLOG(@"host.alpha: %f", host.alpha);
        CCLOG(@"host %@", host);
        CCLOG(@"[host superview]: %@", [host superview]);
        [host removeFromSuperview];
        [host release];
    }];
}

4つのログステートメントはすべて機能し、期待される内容を出力します。したがって、「ホスト」とホストのスーパービューはログステートメントに対して有効です。ただし、[hostremoveFromSuperview]ではクラッシュします。また、たくさんのブレークポイントをいじってみました。ただし、デバッグコマンドは完了ブロック内では機能しません。おそらく完了ブロックが0ではなくスレッド1で実行されているため、どのivarもスコープ内にありません。誰かがここで何が起こっているのか教えてもらえますか?

4

1 に答える 1

1

[host release]ブロックの内側を見てください。それhostはインスタンス変数だと思いますか?(ローカル変数ではないようです。)その場合は、リリースした後、次nilのように設定する必要があります。

[host release];
host = nil;

そうしないと、割り当てが解除されたオブジェクトを指す可能性があり、それを使用する次の場所がクラッシュします。

于 2012-07-21T08:44:52.223 に答える