【问题标题】:UIViewController Animation memory releaseUIViewController 动画内存释放
【发布时间】:2012-04-11 00:40:46
【问题描述】:

看看我下面的代码,点击“返回”按钮后出现内存错误,如果我删除[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];
}

【问题讨论】:

  • 你添加aboutView.view而不是aboutView本身有什么原因吗?崩溃的原因是aboutView没有被保留。

标签: iphone animation sdk


【解决方案1】:

问题可能是[self.view removeFromSuperview];中的-(IBAction)back;

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

addSubview:addSubview:时控制器的视图会保留AboutView

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

所以当视图被释放时,aboutView 也会被释放。

【讨论】:

  • 那么如何在不使用 [self.view removeFromSuperview] 的情况下关闭 Second View 中的 self.view。
  • 您可能想要做的是将所有这些控制器放在 UINavigationController 堆栈中,然后将其弹出。如果您在需要动画的控制器上执行某些操作,则应将其作为子视图添加到 self.view 并为子视图设置动画。
【解决方案2】:

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

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

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

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

用方法定义一个协议

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

让Parent实现它,然后去:

父母

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

    (dont release)

    aboutView.delegate = self;
}

关于视图类

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

    [self.delegate subViewClosed:self];
}

父母

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

【讨论】:

  • 我无法从 AboutView ViewController 调用 subViewClosed,因为它是在 Parent ViewController 中定义的,self.delegate 无效行。
【解决方案3】:

在您的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];
    }];
}

【讨论】:

  • 从 Superview 中删除 aboutView 后不会调用 viewDidAppear。
  • @Houranis 嗨,我已经编辑了我的帖子,以反映在没有控制器的情况下管理视图动画的正确方法(因为你说没有调用控制器委托)。
猜你喜欢
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2014-09-12
  • 2014-04-20
  • 1970-01-01
  • 2012-01-12
  • 2018-10-26
相关资源
最近更新 更多