【问题标题】:UIViewcontroller never deallocatedUIViewcontroller 从未被释放
【发布时间】:2012-07-23 02:31:25
【问题描述】:

我来这里寻求帮助,因为我正在完成我的 iphone 项目,我希望它是完美的!

我对@9​​87654321@ 的allocationdeallocation 有一些问题。

让我解释一下:

我有一个带有自定义单元格的UITableview。在每个自定义单元格中,一个按钮将分配一个新的UIViewControllerListOfAGuestFriendViewController;

所以,我创建了一个委托,它调用一个方法来进行“翻转过渡”,并显示我的新 ListOfAGuestFriendViewController 视图。

我的问题是,我的addSubiew所有 都遇到了同样的问题,ListOfAGuestFriendViewController 永远不会得到 deallocated,或者在视图加载后被释放!

谁能准确地解释我如何才能制作出一个完美 addSubview ?

这是我的代码:

当我翻转视图时:

-(void)flipAView
{
    Guest *currentSelectedGuest = [self createAGuestUsingIndexPath:self.selectedIndex];

    ListOfAGuestFriendViewController *listOfAGuestFriendViewController = [[ListOfAGuestFriendViewController alloc]init];

    [listOfAGuestFriendViewController setCurrentGuestSelected:currentSelectedGuest];
    [listOfAGuestFriendViewController setMyListOfContactControllerDelegate:self];

    [UIView animateWithDuration:0.25 animations:^{
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight 
                           forView:self.tableviewContainerView cache:YES];
        [self.tableviewContainerView addSubview:listOfAGuestFriendViewController.view];
    }completion:^(BOOL finished){
        [listOfAGuestFriendViewController release];
        [self collapseCurrentExpandedCell];
    }];
}

当我想回去时:

-(IBAction)goBackButtonGotPressed:(id)sender{
    [UIView animateWithDuration:0.5 animations:^{
        [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft 
                           forView:[self.view superview] cache:YES];
        [self.view removeFromSuperview];
    }];
}

如果我删除那行代码:

[listOfAGuestFriendViewController release];

我的listOfAGuestFriendViewController 永远不会解除分配。

我不为此实例使用属性,但是当我这样做时,它是一样的!

【问题讨论】:

  • 显然你的应用不是基于 ARC 的。为什么不将其转换为 ARC。许多(如果不是全部)这些内存管理问题都会消失。当你想释放或释放某些属性或 ivar 时,只需将其设置为 nil。
  • 我现在不太喜欢 ARC...在 ARC 中转换我的所有项目会花费太多时间...我还有另一个项目要处理:(
  • 我认为你的问题是当你添加这一行时 [listOfAGuestFriendViewController release]; dealloc 有效,如果这一行 [listOfAGuestFriendViewController release];删除然后 dealloc 永远不会工作,是吗?
  • 如果我删除那行代码:[listOfAGuestFriendViewController release];永远不会调用 dealloc 方法,但如果我不调用,则会在 viewDidLoad 之后调用 dealloc 方法
  • @MidhunMP 当我点击我的 goBackButton 时,在我的 listOfAGuestFriendViewController 中调用 -(IBAction)goBackButtonGotPressed:(id)sender{} 方法!该方法必须翻转 listOfAGuestFriendViewController.view 并释放我的 listOfAGuestFriendViewController

标签: iphone memory-management uiviewcontroller dealloc


【解决方案1】:

让我用你的代码解释一下:

ListOfAGuestFriendViewController *listOfAGuestFriendViewController = [[ListOfAGuestFriendViewController alloc]init];

当您创建一个对象时,保留计数将为 1。

当您这样做时:[self.tableviewContainerView addSubview:listOfAGuestFriendViewController.view]; 接收者视图将保留该视图。 那么它的retaincount就会变成2。

之后:[self.view removeFromSuperview]; 保留计数将变为 1。

每个对象只有在它的retaincount变为0后才会被释放。 在上面的例子中它是 1,所以它永远不会调用 dealloc 方法。

如果你写这行:[listOfAGuestFriendViewController release];[self.tableviewContainerView addSubview:listOfAGuestFriendViewController.view]; 之后这意味着它的保留计数从 2 减少到 1,所以当你调用 [self.view removeFromSuperview]; 时,你的视图将被释放。 参考addSubview 参考Memory Management

【讨论】:

  • 我就是这么想的!但我不知道为什么,当我这样做时! listOfAGuestFriendViewController 中的 dealloc 方法是在视图加载完成后调用的!
  • 当您从代码中删除[listOfAGuestFriendViewController release]; 时,对象的retain count 变为1,然后直到retaincount 变为0 时才会调用dealloc。
  • 收到了吗,还是有问题?
  • 是的,我仍然拥有它,我没有更改我的代码中的任何内容...我的 listOfAGuestFriendViewController 在 vi​​ewDidLoadMethod 之后被释放
  • @Pwyll28:检查这个链接,在这个链接中,他们说 dealloc 只会被调用。 stackoverflow.com/questions/2261972/…。我会找到确切的答案,并一定把它传给你:)
【解决方案2】:

你检查dealloc函数了吗? // Tu as une fonction dealloc dans tes ViewController qui est appelée automatiquement quand ta vue est retirée.

- (void)dealloc
{
    [yourThings release], yourThings = nil;
    [super dealloc];
}

【讨论】:

  • 是的,我已经检查过了!我在 dealloc 函数中设置了一个断点!如果我删除那行代码:[listOfAGuestFriendViewController release];永远不会调用 dealloc 方法,但如果我不调用,则会在 viewDidLoad 之后调用 dealloc 方法
猜你喜欢
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多