首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ARC应用程序上没有调用Dealloc

在ARC应用程序上没有调用Dealloc
EN

Stack Overflow用户
提问于 2012-02-09 21:25:12
回答 7查看 35.9K关注 0票数 38

我有一个UIViewController,它被推到容器控制器上,然后弹出,使用分配工具,我可以看到视图控制器随后被销毁。但是,控制器的dealloc中的断点永远不会到达。有人知道为什么不叫dealloc吗?ARC有可能在不调用dealloc的情况下摧毁一个对象吗?

另外,我还禁用了NSZombies (有些人说这会导致dealloc不着火)。

编辑:

Dealloc做的不多,只会打印到控制台,它永远不会被调用:

- (void)dealloc { NSLog(@"Deallocating..."); }

我不能张贴集装箱控制器-它是专有的,太复杂了。Dealloc在某些控制器上一直被称为Dealloc,而在其他控制器上被称为Dealloc。如果我能找到时间,我将尝试发布一个简单的版本,复制问题。

是否有任何方法来验证NSZombies是禁用的?

Edit2

我发了一张来自仪器的截图,在我看来,这是正确的交易。

EN

回答 7

Stack Overflow用户

发布于 2012-09-21 15:02:33

我刚刚遇到了一个类似的问题。你有什么街区,你指的是“自我”吗?在我的文章中,我有一些提示观察的块,我指的是“自我”。在弧下,自我被保留在块中。我的脱衣舞没有被打电话,这就是我移除观察的地方。

诀窍是创建对“self”的__weak (iOS 5+)或__unsafe_unretained (iOS 4.x)引用,并使用它在块中访问self或任何_iVars (这些都会导致“self”被保留)。下面是一个例子。

代码语言:javascript
复制
__unsafe_unretained TableViewController *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
        if (weakSelf.tableView) {
            [weakSelf.tableView reloadData];
        }
    }];
票数 93
EN

Stack Overflow用户

发布于 2013-09-13 20:27:52

在我的例子中,是NSTimer。它保留了它的目标,所以当您完成视图控制器时,需要使计时器失效。

票数 24
EN

Stack Overflow用户

发布于 2012-08-26 02:56:42

如果VC没有调用dealloc,那么我敢打赌代码中有一个循环引用,它阻止ARC调用dealloc。

有些事情需要检查:

  1. ,您是否有一个对象实例化,如果需要引用VC,则引用VC?
  2. ,请确保您使用了“__unsafe_unretained”属性或“弱”(iOS5+),这样就不会发生保留周期。

当我的委托声明没有使用__unsafe_unretained时,我感到很难受。

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9219030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档