【问题标题】:Why does NSNumber wrong count a retaincount?为什么 NSNumber 错误地计算了一个 retaincount?
【发布时间】:2011-12-01 10:46:22
【问题描述】:

这是保留计数代码。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[])
{

    @autoreleasepool {

        NSNumber *number = [[NSNumber alloc]initWithInt:10];
        NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity:0];

        NSLog(@"retain count : %d",[number retainCount]);

        [array addObject:number];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);

        [number release];
        NSLog(@"retain count : %d",[number retainCount]);
    }
    return 0;
}

我的预期答案是

retain count : 1
retain count : 2
retain count : 1
retain count : 0
and then error

但实际运行结果如下。

[Switching to process 6363 thread 0x0]
2011-12-01 19:39:53.843 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.846 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.847 nsnumber[6363:707] retain count : -1
2011-12-01 19:39:53.848 nsnumber[6363:707] retain count : -1

我无法理解这个结果。

为什么会出现这样的结果?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    不要相信保留计数的值。特别是当您使用 ARC 时!遵守规则。就是这样。

    【讨论】:

    【解决方案2】:

    NSNumber 返回某些数字的单例实例(我相信整数 1 到 12 或其他数字)。

    您永远不应该依赖retainCount 的值。在您的代码或框架代码中可能会发生任何数量的事情,这些事情可能会改变保留计数。

    【讨论】:

      【解决方案3】:

      关于retainCount

      这种方法在调试内存管理时通常没有任何价值 问题。因为任何数量的框架对象都可能保留了一个 对象以保存对它的引用,同时 自动释放池可以在一个 对象,您不太可能从 这个方法。

      另见

      http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/occ/intfm/NSObject/retainCount

      When to use -retainCount?

      【讨论】:

        【解决方案4】:

        retainCount的返回类型为NSUInteger;这是一个 无符号 整数。 string format specifier %d 用于有符号整数。

        Cocoa 使用NSUIntegerMax 来表示不朽对象的保留计数——永远不会被释放的对象。出于性能原因,它会缓存和重用表示小整数的 NSNumber 对象——您创建的这个 NSNumber 显然就是其中之一,并且是不朽的。

        当您将最大无符号整数值解释为有符号时(在two's complement arithmetic 下),它似乎是 -1。

        要查看“真”值,您应该使用说明符 %lu,如我上面链接到的图表所示。

        不过,你一般shouldn't rely on retainCount to give you any useful information。这个is documented

        因为任何数量的框架对象可能已经保留了一个对象以保存对它的引用,而同时自动释放池可能会在一个对象上保存任何数量的延迟释放,所以您不太可能会变得有用来自此方法的信息。

        作为beryllium already noted

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-26
          • 2011-05-15
          • 2020-05-07
          • 2012-03-05
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多