【问题标题】:Retain count after creating NSString创建 NSString 后保留计数
【发布时间】:2010-10-29 11:40:44
【问题描述】:

我正在通过以下方法创建一个 NSString 类型的对象

NSString *str = [[NSString alloc] initWithString:@"aaaaaaaaaaaaaaa"];
    NSLog(@"retain count == %d",[str retainCount]);

之后我只打印保留计数值

2010-10-29 17:04:03.939 示例 [1580:207] 保留计数 == 2147483647

任何人都可以回答为什么这里的日志打印这样的垃圾值

谢谢,

【问题讨论】:

    标签: iphone


    【解决方案1】:

    不要使用 -retainCount。

    对象的绝对保留计数是没有意义的。

    您应该调用release 的次数与您导致对象被保留的次数完全相同。不会少(除非您喜欢泄漏),当然也不会更多(除非您喜欢崩溃)。

    详情请参阅Memory Management Guidelines


    在这种特定情况下,您通过调用alloc 引起了一个retain,因此,您需要在代码中的某个地方、任何地方调用release(或autorelease)一次。

    【讨论】:

    • 只是为了澄清这方面的新人,autorelease 也算作对release 的调用。
    【解决方案2】:

    您正在从字符串文字创建一个不可变的 NSString 对象。字符串文字是在编译时创建的,并且在程序的整个运行时都存在 - 所以它不能被释放并且保留/释放对其没有影响。为了优化(因为您的 NSString 无论如何都是不可变的)-initWithString: 方法可以只返回传递给它的字符串,以便将字符串文字地址分配给您的 str 变量。

    如果您将初始化代码更改为-initWithFormat:,那么我想您将获得预期的保留计数值

    【讨论】:

    • initWithString: 不能为其调用者的变量分配任何东西。但是,它可以实现为简单地返回它传递的字符串,而复制字符串不会带来任何好处。
    • @Peter,你说得对。我更正了答案(希望我的英语不会在这里再次让我失望:()
    【解决方案3】:

    常量和字面量具有保留计数 = INT_MAX,它们不能被释放,因为它们是单独分配的,而不是与其他对象一起在堆上分配 (afaik)

    【讨论】:

      【解决方案4】:

      你的值是 UINT_MAX=0x7FFFFFFF

      你可以在一个类中重写这个方法来实现你自己的引用计数方案。对于永远不会被释放的对象(也就是说,它们的释放方法什么都不做),这个方法应该返回 UINT_MAX,定义在 limits.h 中。

      是静态字符串,对象不能被dealloc。

      【讨论】:

        猜你喜欢
        • 2015-06-16
        • 2011-04-27
        • 2011-10-01
        • 1970-01-01
        • 2013-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多