我有这个非常简单的程序,我只需创建一个对象并查看保留计数。
#import <Foundation/Foundation.h>
#import "GeometryCalculator.h"
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
GeometryCalculator *calculator = [[GeometryCalculator alloc] init];
NSLog(@"Counter: %d", [calculator retainCount]);
[calculator release];
[pool drain];
return 0;
}
我预计我的retainCount为1,但它是16863520。 Class GeometryCalculator完全是空的。没有方法,没有实例变量。
答案 0 :(得分:7)
您正在使用启用垃圾收集功能对此进行测试。 retainCount
的结果在垃圾收集下是未定义的,但实际上,它返回对象的指针值,因为这是最快的未定义事物(在这种情况下,0x1015120
)。
(Trivia:你也在32位进程中进行测试。如果它是一个64位进程,你会得到指针的高位字,因为Peter指的是截断类型,那就是较低的值。)
答案 1 :(得分:3)
正确的类型说明符是%lu
,而不是%d
。 retainCount
方法返回NSUInteger
,它是无符号且大小相等于long
- 因此,实际上,它等同于unsigned long
,您使用%lu
}。 %d
是int
,已签名并且(在某些架构上)更短。使用错误的类型说明符是获取错误输出的好方法。所以,看看是否修正了你的输出。
如果没有,那肯定是一个难题。
答案 2 :(得分:0)