我有一个名为'host'的UIView,其中包含许多其他视图。主机是glView的子视图。 host也是一个实例变量。所以我有以下方法:
-(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];
}];
}
它应该淡出主机视图,然后将其从超级视图中删除。它工作了几个星期,但现在它在'[host removeFromSuperview];'行上的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];
}];
}
所有四个日志语句都可以工作并打印出预期的内容。所以'host'和host的superview对日志语句有效。但它仍然在[host removeFromSuperview]崩溃。我也玩了很多断点。但是调试命令在完成块内部不起作用 - 没有一个ivars在范围内,可能是因为完成块在线程1而不是0上运行。任何人都可以告诉我这里发生了什么?
答案 0 :(得分:1)
查看区块内的[host release]
。我猜测host
是一个实例变量? (它似乎不是一个局部变量。)如果是这样,在你发布之后,你应该把它设置为nil
,就像
[host release];
host = nil;
否则,它可能指向一个解除分配的对象,下一个使用它的地方将崩溃。