2010-12-20 82 views
7

我有一個基於導航的視圖控制器,並在視圖控制器中隱藏頂部導航欄,並使用自定義UIView作爲導航欄。UIViewController&UIview dealloc沒有被調用

UIView欄有一個後退按鈕,我使用Delegate方法(我已經聲明瞭一個協議)在後臺按鈕被打開時與視圖控制器進行通信。

我在我的CustomNavigation Bar中使用委託 id delegate;

,並在主視圖控制器的時候,我分配在導航欄我設置委託

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)]; 
topBar.lblTitle.text = @"Shop"; 
topBar.delegate = self; 

我發佈這個酒吧在ViewControllers的dealloc。

現在當我按下後退按鈕時,我使用委託方法在主ViewController中調用popViewController。

//in Custom Bar 
-(void)ButtonPressed { 
    [delegate TopNavigationBarBackButtonPressed]; 
} 

//In View COntroller 
-(void)TopNavigationBarBackButtonPressed { 

    [self.navigationController popViewControllerAnimated:YES]; 
} 

現在的ViewController彈出,控制轉移到以前的viewController不過的dealloc沒有在這兩個視圖控制器和UIView的

解僱我到底做錯了什麼?

+0

任何想法的人?如果retainCount不是0,dealloc將不會被調用。但是我不保留viewController的任何地方。在我將它推入堆棧後,我做了一個[vewController release]。所以我能想到的唯一原因是我寫的自定義協議。我必須釋放它嗎?我確實保留了該財產的代表。但即使我在dealloc中釋放它,它也不會被調用。難倒! – 2010-12-21 06:43:57

回答

16

好的!終於明白了問題所在。

是的,它是代表。所以在我的「後退按鈕」方法中,我需要將代理設置爲NIL。

-(void)TopNavigationBarBackButtonPressed { 

topBar.delegate = nil; 
[self.navigationController popViewControllerAnimated:YES]; 
} 

瞧,所有的dealloc都會被調用。該死的你自定義協議。我生命中的2天我永遠不會回來。

編輯: 好吧不需要設置委託爲零。

我有所有的問題,因爲在財產我保留代表。

@property(nonatomic, retain)id <ASNavigationDelegate>delegate; 

這應該是

@property(assign)id <ASNavigationDelegate> delegate; 
+1

我有一堆視圖沒有發佈,因爲這一點,我寫了一段糟糕的代碼複製了很多次 - 謝謝! – Slee 2011-12-19 16:25:59

+0

重寫保留/釋放並查看調用堆棧也可能對這些情況有所幫助。 – markshiz 2012-02-08 23:13:29

相關問題