2

看看我下面的代码,点击“返回”按钮后出现内存错误,如果我删除[aboutView release]问题就解决了,这是为什么?以及我应该如何发布 aboutView?

-(IBAction)swichView {
    AboutView *aboutView = [[AboutView alloc] init];
    [aboutView.view setAlpha:0];
    [self.view addSubview:aboutView.view];
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:1.0];  
    [aboutView.view setAlpha:1];
    [UIView commitAnimations];
    [aboutView release];
}

第二个视图控制器:

-(IBAction)back {
    [UIView beginAnimations:@"" context:nil];
    [UIView setAnimationDuration:1.0];
    [self.view setAlpha:0];
    [UIView commitAnimations];
    [self.view removeFromSuperview];
}
4

3 回答 3

0

在您的switchView中,您不应该创建AboutView. AboutView *aboutView应该创建为实例变量,而不是函数局部变量。

由于视图控制器动画的设计,动画本身不会保留您的控制器并在动画结束时自动释放它。您的代码在动画期间取消分配视图控制器,这就是它会崩溃的原因。

要在动画后正确释放视图,请尝试:

-(IBAction)switchView {
    // given that aboutView is an instance variable
    aboutView = [[AboutView alloc] init];
    [aboutView.view setAlpha:0];
    [self.view addSubview:aboutView.view];
    [UIView animationWithDuration:1.0 animations:^{
        [aboutView.view setAlpha:1];
    } completion:^(BOOL fin) {
        // don't release it
    }];
}

-(IBAction)back {
    [UIView animationWithDuration:1.0 animations:^{
        [aboutView.view setAlpha:0];
    } completion:^(BOOL fin) {
        [aboutView.view removeFromSuperview];
        [aboutView release];
    }];
}
于 2012-04-11T00:57:39.657 回答
0

问题大概[self.view removeFromSuperview];出在-(IBAction)back;

你不需要那个。在 aUIViewController中,只要您在其中释放它,它的视图就会为您处理dealloc

AboutView 将由控制器的视图保留,当您addSubview:

此方法保留视图并将其下一个响应者设置为接收者,这是它的新超级视图。-- 文档addSubview:

因此,当视图被释放时,aboutView.

于 2012-04-11T02:40:10.553 回答
0

在方法 '-(IBAction)swichView' 之后似乎没有任何东西保留 aboutView 对象

行'[self.view addSubview:aboutView.view];'

会给aboutView.view一个额外的参考计数,而不是aboutView本身。

我可能会使用类似于 UIPopoverViewController 工作方式的委托模型。

使用方法定义一个协议

-(void) subViewClosed:(AboutView*)aboutView;

让父母实现它,然后去:

家长

-(IBAction)swichView {
    .. existing stuff ..

    (dont release)

    aboutView.delegate = self;
}

关于查看类

-(IBAction)back {
    ... existing stuff ...

    [self.delegate subViewClosed:self];
}

家长

-(void) subViewClosed:(AboutView*)aboutView{
    [aboutView release];
}
于 2012-04-11T05:12:57.003 回答