UIViewController动画内存释放

时间:2012-04-11 00:40:47

标签: iphone animation sdk

看下面我的代码,单击“返回”按钮后出现内存错误,如果删除了[aboutView发布],问题就解决了 这是为什么?以及我应该如何发布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];
}

Second View Contorller:

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

3 个答案:

答案 0 :(得分:0)

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

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

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

-(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];
    }];
}

答案 1 :(得分:0)

[self.view removeFromSuperview];

中的问题可能是-(IBAction)back;

你不需要那个。在UIViewController中,只要您在dealloc中发布,就会为您处理其视图。

当您addSubview:

时,控制器的视图将保留AboutView
  

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

的文档

因此,当视图发布时,aboutView也会发布。

答案 2 :(得分:0)

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

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

这一行

会为 aboutView.view 提供额外的引用计数,但不会 aboutView 本身。

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

使用

的方法定义一个protocal
-(void) subViewClosed:(AboutView*)aboutView;

让Parent实现它,然后转到:

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

    (dont release)

    aboutView.delegate = self;
}

AboutView类

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

    [self.delegate subViewClosed:self];
}

-(void) subViewClosed:(AboutView*)aboutView{
    [aboutView release];
}