【问题标题】:Why is the retainCount still 1 after [object release]?为什么[对象释放]后retainCount还是1?
【发布时间】:2011-03-22 12:48:58
【问题描述】:
NSLog(@"first:%u",[object retainCount]);
[object release];
NSLog(@"second:%u",[object retainCount]);

输出:

第一:1 第二:1

为什么对象没有被释放?

【问题讨论】:

标签: iphone objective-c


【解决方案1】:

从 NSObject 引用中引用的 retainCount 方法

这种方法通常没有价值 在调试内存管理问题。 因为任意数量的框架 对象可能保留了一个对象 为了保持对它的引用,而 同时自动释放池可能 持有任意数量的延期 释放在一个物体上,这是非常 不太可能有用 来自此方法的信息。

【讨论】:

  • 对文档报价大加 1。该方法的主要作用是将开发人员发送到 SO 以提出越来越疯狂的问题。
  • 哈哈,我喜欢这两个cmets。
  • 除非您有不会释放的对象,并且您不能在它们上运行 Instruments。 SO 目前是 99% 的噪音,1% 是关于这个主题的信号,这要归功于所有“不要看 retainCount”的响应
【解决方案2】:

对象可以被释放,但不是在你认为它会释放的时候。基本上,不要看retainCount。它可能在下一个运行循环之前不会改变,或者根本不会改变,它是一个实现细节。您将了解何时需要发布,何时不需要发布,但在此之前依赖 clang 分析器。

【讨论】:

    【解决方案3】:

    首先,retainCount 没有给你一个可以使用的号码。没有意义。

    其次,retainCount 为 0 的原因是可能您尝试使用一个不再存在的对象。你很幸运你的应用程序没有崩溃,因为你访问了无效的内存。在释放对象之前减少 retainCount 是不必要的,因此 Apple 不会这样做,可能

    【讨论】:

      【解决方案4】:

      将任意数除以零,你会发现“保留计数为零的对象”的含义。

      【讨论】:

        【解决方案5】:

        我同意其他 cmets 关于不使用 retainCount 来获得可靠计数的观点。

        编辑:忽略我下面的愚蠢...... :)

        但是,我观察到将相应的属性设置为 nil...

        self.object = nil;
        

        retainCount 确实倾向于立即递减。

        【讨论】:

        • 这应该如何回答这个问题?
        • 回答这个问题,你就会明白反对意见; foo = nil; [foo retainCount];[nil retainCount]; 或 [0 retainCount];`有何不同?
        • 噢!在发布 self.object = nil; 后,我意识到我的错误最终会将 retainCount 发送到一个 nil 对象,该对象显然返回 0。我的编辑速度太慢,无法停止投票。
        猜你喜欢
        • 2012-02-23
        • 2012-03-05
        • 1970-01-01
        • 2011-11-18
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        相关资源
        最近更新 更多