这个街区出了什么问题?

时间:2012-07-21 03:42:04

标签: ios animation objective-c-blocks

我有一个名为'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上运行。任何人都可以告诉我这里发生了什么?

1 个答案:

答案 0 :(得分:1)

查看区块内的[host release]。我猜测host是一个实例变量? (它似乎不是一个局部变量。)如果是这样,在你发布之后,你应该把它设置为nil,就像

一样
[host release];
host = nil;

否则,它可能指向一个解除分配的对象,下一个使用它的地方将崩溃。