【问题标题】:iOS non-zero reference count in ARC and cannot deallocARC 中的 iOS 非零引用计数且无法解除分配
【发布时间】:2014-10-23 12:30:35
【问题描述】:

大家好

我正在尝试在 ARC 模式下释放 ViewController。 但是,RefCount 始终非零。

我尝试将所有对象设置为 nil,并将所有子视图设置为 removeFromSuperview + nil; 和定时器无效+ nil; 仍然是计数器 = 2;

有没有办法跟踪哪个指针仍在保留中?

谢谢

【问题讨论】:

    标签: ios objective-c automatic-ref-counting dealloc


    【解决方案1】:

    如果您使用块,您也可以在那里创建保留周期。例如。一个块被一个对象引用,在这个块内你正在引用对象或调用对象的实例方法。 保留计数不降至 0 的另一个选项是您已将 abject 注册为通知观察者。

    您可能会发现此答案很有帮助: https://stackoverflow.com/a/12286739/2261423

    来自苹果文档的强引用循环示例:

    self.block = ^{
            [self doSomething];    // capturing a strong reference to self
                                   // creates a strong reference cycle
        };
    

    【讨论】:

    • 是的,这很可能是问题所在,我在中间做了很多块...有没有快速搜索来找出哪个块保留了控制器?
    • 这是您在对象中保留引用的块。它在苹果文档中得到了很好的展示:developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… section "Avoid Strong Reference Cycles when Capturing self" self.block = ^{ [self doSomething]; // 捕获对 self 的强引用 // 创建一个强引用循环 };
    • 编译器会抛出一个警告,如果有一个阻塞循环。
    • 如果编译器能够识别这种情况,它会发出警告,但它并不总是这样做。当然你需要打开警告!!!
    【解决方案2】:

    @Billy,你为什么要这样做?使用 ARC 时,您可能不必担心释放。当控制器没有的引用时,控制器将被自动释放。是的,视图不引用控制器,它们是由它引用的!因此,删除该视图不会影响控制器的 retain count。如果你真的想从内存中删除视图控制器,请将其从父视图控制器中删除并将所有链接设置为 nill。

    【讨论】:

    • 感谢您的建议。因为内存一直很高,我想释放内存,所以我尝试在 dealloc 中放置一个断点,但不知何故没有调用它。这意味着我有一些引用控制器的“隐藏”指针。很难全部找出来……
    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    相关资源
    最近更新 更多