Objective-C:为什么我的保留计数不是1?

时间:2010-07-17 07:35:56

标签: objective-c cocoa memory-management

我有这个非常简单的程序,我只需创建一个对象并查看保留计数。

#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完全是空的。没有方法,没有实例变量。

3 个答案:

答案 0 :(得分:7)

您正在使用启用垃圾收集功能对此进行测试。 retainCount的结果在垃圾收集下是未定义的,但实际上,它返回对象的指针值,因为这是最快的未定义事物(在这种情况下,0x1015120)。

(Trivia:你也在32位进程中进行测试。如果它是一个64位进程,你会得到指针的高位字,因为Peter指的是截断类型,那就是较低的值。)

答案 1 :(得分:3)

正确的类型说明符是%lu,而不是%dretainCount方法返回NSUInteger,它是无符号且大小相等于long - 因此,实际上,它等同于unsigned long,您使用%lu }。 %dint,已签名并且(在某些架构上)更短。使用错误的类型说明符是获取错误输出的好方法。所以,看看是否修正了你的输出。

如果没有,那肯定是一个难题。

答案 2 :(得分:0)