Objective c 为什么NSNumber错误计算重新计数?

Objective c 为什么NSNumber错误计算重新计数?,objective-c,Objective C,这是重新记账代码 #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { @autoreleasepool { NSNumber *number = [[NSNumber alloc]initWithInt:10]; NSMutableArray *array = [[NSMutableArray alloc]initWithCapacity

这是重新记账代码

#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;
}
但实际运行结果如下

[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
我不能理解这个结果


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

不要相信retain count的值。尤其是当您使用ARC时!遵守规则。仅此而已。

不要相信retain count的值。尤其是当您使用ARC时!遵守规则。仅此而已。

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


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

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

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

关于重新计数

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

另见

关于重新计数

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

另见


返回类型
retainCount
NSUInteger
;这是一个无符号整数。
%d
表示有符号整数

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

当您将最大无符号整数值解释为有符号时(在下),它看起来是-1

要查看“true”值,应使用说明符
%lu
,如上面链接的图表所示

不过,你一般都是这样。这:

由于任意数量的框架对象可能保留了一个对象以保存对该对象的引用,而同时自动释放池可能保留了一个对象上任意数量的延迟发布,因此您不太可能从该方法中获得有用的信息


as.

返回类型
retainCount
NSUInteger
;这是一个无符号整数。
%d
表示有符号整数

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

当您将最大无符号整数值解释为有符号时(在下),它看起来是-1

要查看“true”值,应使用说明符
%lu
,如上面链接的图表所示

不过,你一般都是这样。这:

由于任意数量的框架对象可能保留了一个对象以保存对该对象的引用,而同时自动释放池可能保留了一个对象上任意数量的延迟发布,因此您不太可能从该方法中获得有用的信息


正如。

+1所示,这意味着您不能将retainCount与ARC一起使用。好了,这甚至不能在ARC下编译;使用
retainCount
会引发错误。+1这意味着您不能将retainCount与ARC一起使用。好了,这甚至不能在ARC下编译;使用
retainCount
会引发错误。
[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