2012-04-11 74 views
2

看看我下面的代码,我点击“后退”按钮后出现内存错误,如果我删除,问题将被修复[aboutView release] 为什么?以及我应该如何发布关于视图?UIViewController动画内存版本

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

第二个视图Contorller:

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

是否有一个原因,你添加'aboutView.view'而不是'aboutView'本身?崩溃的原因是'aboutView'不被保留。 – 2012-04-11 05:20:15

回答

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]; 
    }]; 
} 
+0

从Superview中移除aboutView后,viewDidAppear不会被调用。 – Houranis 2012-04-11 01:16:45

+0

@Houranis嗨,我已经编辑我的帖子,以反映管理视图动画没有控制器的正确方式(因为你说控制器委托没有被调用)。 – 2012-04-11 12:27:15

0

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

你不需要这一点。在UIViewController中,只要您在dealloc中发布它,它的视图就会为您处理。

AboutView将由控制器的视图,当你addSubview:

此方法保留视图,并将其下一个应答器的接收器,这是它的新上海华被保留。 - Google文件addSubview:

所以当视图得到释放,所以将aboutView

+0

那么如何在不使用[self.view removeFromSuperview]的情况下在Second View中关闭self.view。 – Houranis 2012-04-11 03:05:35

+0

可能希望你想要做的就是把所有这个控制器放在UINavigationController栈中,然后弹出它。如果您在需要动画的控制器上执行某些操作,则应将其添加到self.view中作为子视图,然后改为使用子视图的动画效果。 – Allyn 2012-04-11 15:28:04

0

似乎没有任何的方法之后被保持aboutView对象 ' - (IBAction为)swichView'

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

会给出额外的引用计数到aboutView.view,但不aboutView本身。

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

定义与方法的protocal沿

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

的线条使母公司实现它,然后去:

家长

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

    (dont release) 

    aboutView.delegate = self; 
} 

AboutView类

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

    [self.delegate subViewClosed:self]; 
} 

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

我无法从AboutView ViewController调用subViewClosed,因为它在父视图控制器中定义,self.delegate无效行。 – Houranis 2012-04-11 16:54:50