UIViewController&UIview dealloc没有被调用

问题描述:

我有一个基于导航的视图控制器,并在视图控制器中隐藏顶部导航栏,并使用自定义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

好的!终于明白了问题所在。

是的,它是代表。所以在我的“后退按钮”方法中,我需要将代理设置为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