他の多くのビューを含む「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もスコープ内にありません。誰かがここで何が起こっているのか教えてもらえますか?