【问题标题】:Conditions in which retainCount increases or decreasesretainCount 增加或减少的条件
【发布时间】:2011-05-14 08:26:12
【问题描述】:

我已经读到对象保留计数,并且当我们分配第二个值(或对象)时它可以增加。

谁能给我一个关于 retainCount 增加或减少的基本条件的想法(没有 retain , alloc 和 release)...

【问题讨论】:

    标签: objective-c memory-management retaincount


    【解决方案1】:

    对象的保留计数是您不必担心的实现细节。你真的应该只关心你何时获得和失去一个对象的所有权。原因如下:

    +alloc 返回一个保留计数为 1 的对象。但是,您立即向它发送一条初始化消息,这可能会给您返回一个完全不同的对象。比如

    NSString* foo = [[NSString alloc] initWithString: @"foo"];
    

    给你一个保留计数为 1 的对象,对吧?在 Cocoa 的当前实现上是错误的。 +alloc 返回的字符串立即被释放,而是返回对@"foo" 的引用。 @"foo" 的保留计数为INT_MAX

    保留一个对象会增加它的保留计数,对吗?可能,但是再次将保留发送到常量字符串没有效果,并且一些单例也有保留的 nul 实现。

    同样的释放通常对保留计数有影响,但也不一定出于相同的原因。

    发送副本应该会给您一个保留计数为 1 的新对象,对吗?错误的。不可变对象可以通过发送自己的保留然后返回自己来实现复制。在大多数情况下,这会使保留计数加一,但当然对于字符串常量,什么也不会发生。

    如果您只考虑保留和释放所有权,那么我刚才所说的所有内容都将成为无关紧要的实现细节。

    【讨论】:

      【解决方案2】:

      对象的retainCount在以下情况下发生变化:

      • 当你创建一个对象(新的或 alloc、copy 或 mutablecopy),它有一个 保留计数为 1。

      • 当您向对象发送保留时 消息,其保留计数为
        增加 1。

      • 当您向对象发送释放时 消息,其保留计数为
        减 1。

      • 当您发送自动释放消息时 到一个对象,它的保留计数 将减 1(不
        立即释放,但 未来一段时间)

      您可以查看此post 以获取有关 iPhone 内存管理工作原理的详细信息。

      【讨论】:

        【解决方案3】:

        简短回答:

        稍长一点:

        通常期望修改保留计数的操作是retainreleaseautorelease 和名称包含newcopy 的调用方法。然而,在某些情况下,出于良好的实施原因,他们可能这样做,而是做其他事情。还有许多您可以做的其他事情,例如将对象添加到集合中,这可能会以与您无关的方式修改保留计数。

        不要使用或依赖保留计数。它们是一个实现细节。 关心的是管理您自己的所有权,您可以通过上述方法的语义来做到这一点。这会如何影响引擎盖下的保留计数,最好不要看。

        请不要这样做。

        关注保留计数几乎总是导致错误的一种方式,而不是解决错误。

        【讨论】:

        • autorelease 不会改变保留计数。
        • 澄清一下:改变保留计数的是自动释放将对象放入的自动释放池的耗尽或释放。
        • @Jeremy:是的,实际上我确实开始进行编辑,以澄清这一点和其他一些细节,但在完成之前我失去了生存的意愿。
        猜你喜欢
        • 1970-01-01
        • 2017-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        相关资源
        最近更新 更多