UIViewController & UIview dealloc 没有被调用

Posted

技术标签:

【中文标题】UIViewController & UIview dealloc 没有被调用【英文标题】:UIViewController & UIview dealloc not getting called 【发布时间】:2010-12-20 08:04:04 【问题描述】:

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

UIView 栏有一个返回按钮,当返回按钮被预置时,我使用 Delegate 方法(我已经声明了一个协议)与视图控制器进行通信。

我在自定义导航栏中使用委托 id 委托人;

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

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

我在 ViewControllers dealloc 中释放了这个 Bar。

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

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


//In View COntroller
-(void)TopNavigationBarBackButtonPressed 

    [self.navigationController popViewControllerAnimated:YES];

现在 ViewController 被弹出并且控制转到前一个 viewController 但在 ViewController 和 UIView 中都没有触发 dealloc

我做错了什么?

【问题讨论】:

任何想法的人?如果retainCount 不为0,则不会调用dealloc。但我没有在任何地方保留viewController。在我将它推入堆栈后,我做了一个 [vewController release]。所以我能想到的唯一原因是我编写的自定义协议。我必须释放它吗?我确实保留了财产中的代表。但即使我确实在 dealloc 中释放它,它也不会被调用。难倒!!! 【参考方案1】:

好的!终于明白是什么问题了。

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

-(void)TopNavigationBarBackButtonPressed 

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

瞧,所有的 dealloc 都被调用了。该死的自定义协议。我生命中的 2 天,我永远不会回来。

编辑: 好的,无需将委托设置为零。

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

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

这应该是

@property(assign)id <ASNavigationDelegate> delegate;

【讨论】:

我有一堆视图因此没有发布,我写的一段糟糕的代码被复制了很多次 - 谢谢! 覆盖保留/释放并查看调用堆栈对这些情况也很有帮助。

以上是关于UIViewController & UIview dealloc 没有被调用的主要内容,如果未能解决你的问题,请参考以下文章

将 UIViewController 的 UI 扩展到子 UIViewControllers

为啥情节提要 ui 元素未显示在 xcode 9 中的 UIViewController 上

从 swiftUI 中的一个嵌入式 UIViewController 导航到 swift UI 中的另一个嵌入式 UIViewcontroller

如何将 UI 元素保留在 UIViewController 及其呈现的 ViewController 之上?

UI 多个视图控制器(UIViewController)间的 协议传值

是否应该明确调用 willMoveToParentViewController:(UIViewController *)parent & didMoveToParentViewControll