iOS - 在ARC下弹出时未释放ViewController

时间:2013-08-22 13:01:07

标签: iphone ios memory-management automatic-ref-counting

我有一个UITabBarController作为我的主基本视图控制器。在第一个标签下,我有一个UINavigationController当然与rootViewController相关联,称之为vcAvcA有一个按钮,使用以下代码触发子视图控制器vcB

[self performSegueWithIdentifier:@"PlacesDetailsSegue" sender:senderDictionary];

这似乎有效,我在仪器中看到vcB的新分配正在发生。 当我将视图控制器弹回vcA时,一切看起来都有效,但似乎vcB永远不会被释放(即,从不调用dealloc)。因此,每次从vcA->vcB->vcA->vcB开始,内存使用量都会增加并增加。

我在vcB中有一些实例变量,所有这些变量都在nil中设置为dealloc。但是由于dealloc没有被触发,它们实际上从未被设置为nil

我有一个[UIView animationWith...]块,它引用self.view的框架属性,但我已经使用代码管理了它:

__unsafe_unretained BBCategoryViewController *weakSelf = self;

[UIView animateWithDuration:duration
    animations:^{
        [_feedTableView setFrame:CGRectMake(0, 
                         _navBar.frame.size.height,
                         weakSelf.view.frame.size.width, 
                         weakSelf.view.frame.size.height - kMenuBarHeight)
        ];

     }
     completion:nil];

有没有人知道我怎样才能找到vcB pop中仍保留哪些对象?

作为参考,我的界面扩展名为:

@interface BBCategoryViewController () <UITableViewDataSource, UITableViewDelegate> {
    UITableView *_feedTableView;
    UIRefreshControl *_refreshControl;
    BBSearchBar *_searchBar;
    MKMapView *_mapView;
    BBNavigationBar *_navBar;
    NSString *_title;
    NSString *_categoryId;
    NSArray *_feedArray;
}
@end

和我的dealloc(永远不会被解雇)是:

-(void)dealloc {

    NSLog(@"Dealloc: BBCategoryViewController\n");
    _feedTableView = nil;
    _refreshControl = nil;
    _searchBar = nil;
    _mapView = nil;
    _navBar = nil;
    _feedArray = nil;

}

UPDATE:这实际上是由于子视图中的保留周期,并且与我首先想到的并不直接与视图控制器相关。 Dan F引导我找到了正确的答案here,万一有人遇到过类似的事情。

1 个答案:

答案 0 :(得分:1)

您的vcB应该完全取消分配,并在弹出回vcA时调用dealloc。你必须要么在某个地方保持对它的强烈引用,要么你的“流行”不正确。如果你用segue这样做,那可能是你的问题 - segues不应该用于倒退(除了展开segues)。因此要么使用unwind segue,要么使用popViewControllerAnimated返回vcA。此外,使用ARC时,无需在dealloc中将ivars设置为nil。