0

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

我在分配释放.UIViewcontroller

让我解释 :

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

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

我的问题是,我的 ALL 都遇到了同样的问题,ListOfAGuestFriendViewControlleraddSubiew永远不会释放,或者在视图加载后被释放!

有人可以准确地解释我如何制作完美的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永远不会解除分配。

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

4

2 回答 2

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参考内存管理 参考

于 2012-07-24T18:30:52.800 回答
0

你检查了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];
}
于 2012-07-24T18:03:56.610 回答