2011-10-03 35 views
1

我正在研究一个应用程序,该应用程序具有一个主视图,该图需要在触摸按钮时产生子视图。因此,当我收到按钮事件时,MainViewController通过调用initWithNibName并将ChildViewController存储在ivar中来衍生子视图。然后我通过附加动画并设置childVC.view.hidden = NO来显示ChildView。为什么我的UIViewController在使用initWithNibName时会得到额外的时间?

这有效,但我注意到在关闭ChildView后,ChildViewController从未获得释放。当我第一次访问子视图时,我意识到ChildVC的保留数从1到2。因此,在笔尖加载内容中的某些东西似乎仍然保留我的ChildVC(除了我期望在对象初始化期间的初始保留)之外。

有人可以帮我弄清楚为什么ChildVC得到保留额外的时间,我怎样才能确保它完全释放时,我想关闭子视图?

编辑:这是一些代码,只是稍微简化。这些是父视图控制器上的方法。

-(IBAction)onLaunchChildButtonTouched:(id)sender 
{ 
    m_childViewController = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil]; 
    [m_childViewController setParentDelegate:self]; // this is a weak reference 

    // m_childViewController retain count here is 1, as expected 
    m_childViewController.view.hidden = YES; 
    // m_childViewController retain count is now 2, not expected 

    [self.view addSubview:m_childViewController.view]; 

    [self addTransitionEntrDir:YES]; // code omitted 

    m_childViewController.view.hidden = NO; 

} 


-(void)onChildWantsToClose:(id)child 
{ 
    NSAssert(child == m_childViewController, @"unexpected childVC"); 

    // if child view is now hidden, we should remove it. 
    if(m_childViewController != nil && m_childViewController.view.hidden) 
    { 
     [m_childViewController.view removeFromSuperview]; 
     [m_childViewController release]; m_childViewController = nil; 

     // BUG: m_childViewController retain count is still 1 here, so it never gets released 

    } 
} 
+0

可能会显示您的实际代码? – Vladimir

+0

显示一些代码将有助于带来A的这个Q. – chown

+0

更新的原始文章与一些代码。 – gga80

回答

0

没有代码是很难说清楚,但是你确定你是不是你分配到ChildVC一些其它物体的retain财产?这可以解释你看到的意外的retain

对不起,以前的答案,我试图传达相同的消息,但我混淆了一切。

OLD答: 记住,一个UIViewControllerview属性被保留: 视图

控制器管理视图。

@属性(非原子,保留)的UIView *视图 所以,如果分配给这样的: childVC.view = [[XXXXX的alloc] initWithNibName:...]; 这解释了你所看到的。 改为使用: childVC.view = [[[xxxxx alloc] initWithNibName:...] autorelease];

+0

感谢您的回复。我使用initWithNibName来初始化ViewController,而不是视图。然后(根据文档)View属性会在我第一次访问它时自动从nib加载。我不是自动释放ViewController,但是我在子视图关闭时手动释放它。问题似乎是ChildVC得到保留一个额外的时间,我不明白为什么。 – gga80

0

我发现这个问题,泄漏的ChildViewController正在实例化一个对象,它保留了一个ref。

有趣的部分是,我不是简单地忘记释放这个参考。我确实有一个调用来释放它,但该代码从未运行,因为它假定viewDidUnload将运行并给我一个释放一切的机会,但它没有。我把deinit代码放在dealloc里面,现在就可以运行了。

+0

发生这种情况的一个常见区域是当'addObserverForName:object:queue:usingBlock:'to'NSNotificationCenter'在'viewDidLoad'内,引用'self',但只有'dealloc'中的removeObserver。 Dealloc将永远不会被定义调用,因为该块将保留“self”。你可以对'self'做一个弱引用来帮助解决这个问题,或者在'viewWillAppear'和'viewDidDisappear'等中订阅/取消订阅通知。 –

相关问题