0

我正在尝试添加 UIViewController 子视图,然后单击按钮将其关闭。我当前的代码可以完成这项工作,我只是不确定它是否会泄漏或导致任何问题。

所以首先我添加子视图

-(IBAction)openNewView:(id)sender{
   // start animation
   [UIView beginAnimations:@"CurlUp" context:nil];
   [UIView setAnimationDuration:.3];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];

   // add the view
   newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]];
   [self.view addSubview:newVC.view];

   [UIView commitAnimations]; 
}

然后在 newViewController.m 我有删除它的功能

-(IBAction)closeNewView:(id)sender{
   // start animation
   [UIView beginAnimations:@"curldown" context:nil];
   [UIView setAnimationDelegate:self];
   [UIView setAnimationDuration:.3];
   [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
   [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view.superview cache:YES];

   // close dialog
   [self.view removeFromSuperview];
   [UIView commitAnimations];

   [self.view release];
}

就像我说的那样有效,但是当我分析代码时,它告诉我:

在第 X 行分配并存储到“newViewController”中的对象的潜在泄漏:

newViewController* newVC = [[newViewController alloc] initWithNibName:@"newViewController" bundle:[NSBundle mainBundle]];

调用者此时不拥有的对象的引用计数的不正确递减[self.view release];

如果我autorelease使用 viewController 而不是[self.view release]它在删除时崩溃(如果我在添加视图后释放视图):-[FirstViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0xd21c7e0

如果我调用[newVC release]任何一个 viewController dealloc,它都无法构建。

希望我不是在问一个相当明显的问题,但是添加和删除视图控制器的正确方法是什么?

4

1 回答 1

0

你用的是什么IOS版本?如果您使用的是 5.0,您可能应该继续切换到 ARC,这样您就不必自己处理 [release] 调用。

如果您仍然想要或需要坚持手动内存管理:如果您尝试释放 newVC,dealloc 无法构建的原因是因为该指针的作用域是函数 openNewView。使其成为班级成员,您就可以释放它。

@implementation WhateverItsCalled {
  newViewController *newVC;
}

- ( IBAction ) openNewView: (id)sender {
...
  newVC = [ [ newViewController alloc ] initWithNibNamed:...
}

- ( void ) dealloc {
  [ newVC release ];
}

是的,如果您不使用 ARC,则每个“alloc”都必须与相应的“release”配对。

另外我必须问 - 你为什么在这里使用视图控制器?如果您只想要一个视图,您可以使用 [ [ NSBundle mainBundle ] loadNibNamed] 从 NIB 加载视图,并将 [self] 列为文件的所有者。这将设置您的所有引用(包括您想要的视图),并且您不必实例化(看起来像)一个多余的视图控制器。

于 2012-04-18T17:51:56.940 回答