UIViewController&;UIview dealloc未被调用

UIViewController&;UIview dealloc未被调用,uiview,delegates,ios4,uiviewcontroller,dealloc,Uiview,Delegates,Ios4,Uiviewcontroller,Dealloc,我有一个基于导航的视图控制器,在视图控制器中我隐藏了顶部导航栏,并使用自定义UIView作为导航栏 UIView栏有一个后退按钮,我使用委托方法(我声明了一个协议)在按下后退按钮时与视图控制器通信 我在自定义导航栏中使用委托 id代表 在主视图控制器中,当我分配导航栏时,我设置了代理 topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)]; topBar.lblTitle.text = @"Shop"

我有一个基于导航的视图控制器,在视图控制器中我隐藏了顶部导航栏,并使用自定义UIView作为导航栏

UIView栏有一个后退按钮,我使用委托方法(我声明了一个协议)在按下后退按钮时与视图控制器通信

我在自定义导航栏中使用委托 id代表

在主视图控制器中,当我分配导航栏时,我设置了代理

topBar = [[TopNavigationBar alloc] initWithFrame:CGRectMake(0, 0, 480, 40)];
topBar.lblTitle.text = @"Shop";
topBar.delegate = self;
我在ViewController中释放此栏

现在,当我按下后退按钮时,我使用委托方法调用主ViewController中的popViewController

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

//In View COntroller
-(void)TopNavigationBarBackButtonPressed {

    [self.navigationController popViewControllerAnimated:YES];
}
现在,ViewController已弹出,控件转到上一个ViewController,但ViewController和UIView中都未触发解除锁定


我做错了什么?

好的!终于明白问题出在哪里了

是的,是代表。因此,在我的“后退按钮按下”方法中,我需要将委托设置为NIL

-(void)TopNavigationBarBackButtonPressed {

 topBar.delegate = nil;
[self.navigationController popViewControllerAnimated:YES];
}
瞧,所有的人都被叫来了。该死的,你的定制协议。在我生命中的两天里,我再也回不来了

编辑: 确定无需将委托设置为零

我遇到了所有的问题,因为我保留了代表

@property(nonatomic, retain)id <ASNavigationDelegate>delegate;
@属性(非原子,保留)id委托;
这应该是

@property(assign)id <ASNavigationDelegate> delegate;
@property(assign)id委托;

有什么想法吗??如果重新计数不是0,则不会调用dealloc。但我不会在任何地方保留viewController。我将[vewController release]推到堆栈上后执行。所以我能想到的唯一原因就是我写的自定义协议。我必须释放它吗?我将委托人保留在酒店内。但即使我在dealloc中发布了它,也不会被调用。难倒了!!!因为这个原因,我有很多视图没有发布,我写的一段糟糕的代码被复制了很多次——谢谢!覆盖retain/release和查看调用堆栈也有助于这些情况。