【问题标题】:Why does sending retainCount to @"Hi" return -1?为什么将retainCount 发送到@“Hi”返回-1?
【发布时间】:2011-01-02 03:33:30
【问题描述】:

retainCount 方法应该返回一个无符号整数。

那为什么[@"Hi" retainCount] 返回-1?

【问题讨论】:

  • /我的脸。 retainCount 对检查自己没有用处。

标签: objective-c types retaincount


【解决方案1】:

简单的答案是,因为@"Hi" 是一个字符串文字,它会一直存在于二进制可执行映像中,并且永远不会“消失”,因此保留/释放无效,而你看到UINT_MAX(打印出来时看起来像-1,例如用%d签名)。(参见Pete Kirkham关于NSObjects具有这些语义的回答)。

除此之外,知道虽然 @"Hi" 的行为类似于 NSString*,但它实际上是类 CFConstantString 的编译器创建的实例(或者可能是 NSConstantString,我的调试器不同意某些文档,这很有用),它包装了文字字符串数据并为您提供了 NSString* 接口。但编译器知道这些字符串是特殊的,永远无法清理,所以它们的 retainCount 总是为 UINT_MAX (-1)

【讨论】:

    【解决方案2】:

    根据 Apple 的 NSObject documentation,它应该为永远不会被释放的对象返回 UINT_MAX。如果您将UINT_MAX 打印为有符号整数,您通常会得到-1,这可能就是您正在做的事情——您是如何输出值的?

    【讨论】:

    • 那是有符号整数。请改用%zu
    【解决方案3】:

    永远不要依赖retainCount 方法。 Cocoa 在幕后进行了各种优化,这使得 retainCount 方法不可靠且无用。甚至 Apple 也不鼓励使用它。坚持为 Cocoa 制定的内存管理规则,您将永远不需要知道任何对象的 retainCount

    【讨论】:

      【解决方案4】:

      有符号整数和无符号整数之间的唯一区别是您如何解释值。如果将 -1 读取为 unsigned int,您会发现它是 unsigned int 的最大值。

      例如:NSLog(@"%u", [@"Hello" retainCount]);

      之所以这么大的值是因为常量字符串对象永远不会被释放。

      【讨论】:

        【解决方案5】:

        @"Hello" 不需要随代码发布,

        请注意对象是由“alloc”创建的,其他没有内存泄漏问题

        【讨论】:

          猜你喜欢
          • 2012-03-05
          • 2013-02-01
          • 2011-09-10
          • 2013-02-28
          • 1970-01-01
          • 2015-09-04
          • 2015-12-03
          • 1970-01-01
          • 2011-08-14
          相关资源
          最近更新 更多