Ios 在ARC应用程序上未调用Dealloc

Ios 在ARC应用程序上未调用Dealloc,ios,ios5,automatic-ref-counting,Ios,Ios5,Automatic Ref Counting,我有一个UIViewController,它被推到容器控制器上,然后弹出,使用分配工具,我可以看到视图控制器随后被销毁。但是,永远不会到达控制器的dealloc中的断点。有人知道为什么不叫dealloc吗?ARC是否可以在不调用dealloc的情况下销毁对象 此外,我还禁用了NSZombies(有些人说这会导致dealloc不开火) 编辑: Dealloc做的不多,只是打印到控制台,而且它从未被调用: -(无效)解除锁定 { NSLog(@“解除分配…”); } 我不能发布容器控制器-它是专有的

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

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

编辑:

Dealloc做的不多,只是打印到控制台,而且它从未被调用:

-(无效)解除锁定
{
NSLog(@“解除分配…”);
}

我不能发布容器控制器-它是专有的,太复杂了。Dealloc在某些控制器上被一致调用,而不是在其他控制器上。如果我能找到时间,我会尝试发布一个简化版本,重现这个问题

有没有办法验证NSZombies是否已禁用

Edit2

我发布了一个来自instruments的截图;在我看来,这似乎是适当的解除分配


如果VC没有调用dealloc,那么我敢打赌代码中的某个地方有一个循环引用,这会阻止ARC调用dealloc

一些需要检查的事项:

  • 您是否有引用回VC的实例化对象
  • 如果需要引用VC,请确保使用了“\u不安全\u未恢复”属性或“弱”(iOS5+)属性,以便不会发生保留循环

  • 当我的代理声明没有使用“不安全”未恢复时,我被掐死了。

    您是否启用了NSzombie?见这个问题:


    我自己也被这个问题困扰了一段时间……

    我刚刚遇到了一个类似的问题。你有没有提到“自我”的地方?我在init中有一些用于通知观察的块,我指的是“self”。弧下的“自”保留在块中。我的dealloc没有接到电话,这就是我删除观察的地方

    诀窍是创建一个对“自我”的“弱”(iOS 5+)或“不安全”(iOS 4.x)引用,并使用该引用访问块中的自我或任何IVAR(这些将导致“自我”也被保留)。这里有一个例子

    __unsafe_unretained TableViewController *weakSelf = self;
    [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
            if (weakSelf.tableView) {
                [weakSelf.tableView reloadData];
            }
        }];
    

    即使使用ARC,您也可以手动检查参考计数:

    CFIndex rc = CFGetRetainCount((__bridge CFTypeRef)myObj);
    
    您可以确定您的代码是否在内存周期中挂起。

    这里有另一个提示(发生在我身上):

    tl;dr:还要查看类实例变量,而不仅仅是类属性。您是否在代码中分配了任何实例变量,并且以后没有将其设置为
    nil

    我有一个类的头文件中有一堆属性(
    @property(非原子,强)
    @property(非原子,弱)
    )。我一个接一个地注释掉这些属性,看看这是否会改变什么。事实并非如此。主类仍然没有被释放。所以问题不在属性上

    我后来做的是查看实例变量。我有一个实例变量(它是一个
    UIViewController
    ),是我在
    viewDidLoad
    上创建的。这一个从来没有被释放

    当我删除这个变量时,我的主类dealloc确实被删除了

    因为这一个没有释放,我的主类也没有释放。将该实例变量作为属性移动解决了我的问题


    问题:我不知道为什么会发生这种情况。操作系统对类属性的控制是否比对实例变量的控制更好?似乎有点奇怪,包含实例变量的父类由于其实例变量而没有被释放。

    在我的例子中,它是
    NSTimer
    。它保留了它的目标,所以当您使用view controller时,需要使计时器无效。

    我的问题是委托

    检查您的代表!委托属性应指定

    弱var委托:SomeProtocol?


    @属性(弱、非原子)id委托

    即使在ARC下,也应该调用它。但是,您不能包括[super Dealoc],ARC将为您添加该内容。可能共享该类的代码?dealloc方法中是否有任何方法?您应该发布
    -(void)dealloc{}
    代码。您是否尝试使用
    NSLog(…)
    来标记您的
    dealloc()
    而不是断点?如果使用ARC,您在dealloc中放了什么代码?也许,如果dealloc代码没有做任何事情,编译器只是在优化它。你有没有试着在里面放一个NSLog()而不是一个断点?我同意@Dean Liu-Instruments的观点,尽管如此,我怀疑它不是因为内存周期而取消分配的。我偶尔会遇到使用块的循环的问题-特别是如果块引用“self”,这很容易做到。这很有帮助!(如果有一个相应的函数调用方法给出引用对象的所有对象的列表,那就太好了)。在代码检查了大量迁移的代码(从非arc项目到arc项目)之后,我可以确认这是不希望的保留周期的主要来源。最后:一个块很方便,很容易创建,对吧!通过不注销观测者,这意味着它将永远对通知作出响应,即使在
    self
    早已消失之后。如果您多次添加此观察者,那么每次发生此通知时,它将永远触发多个无用的观察者。这不是好的编程实践。为了简单起见,我们可以使用弱类型的(self)weakSelf=self
    [NSNotificationCenter addObserverForName:object:queue:usingBlock:][/code>返回一个不透明对象作为观察者。你需要退订。