2011-10-03 32 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'等中訂閱/取消訂閱通知。 –

相關問題