看下面我的代码,单击“返回”按钮后出现内存错误,如果删除了[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];
}
答案 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:
此方法保留视图并将其下一个响应者设置为接收器,这是其新的超级视图。 -
的文档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];
}