为什么retainCount在调用release后返回值?

时间:2010-10-28 06:39:21

标签: iphone objective-c memory-management

我有以下简单的代码:

NSMutableArray *array = [[NSMutableArray alloc] init];

    NSObject *o = [[NSObject alloc] init];
    NSObject *o1 = [[NSObject alloc] init];
    NSObject *o2 = [[NSObject alloc] init];

    [array addObject:o];
    [array addObject:o1];
    [array addObject:o2];
    NSLog(@"-------");
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);
    [array release];
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);
    [o release];
    [o1 release];
    [o2 release];
    NSLog(@"-------");
    NSLog(@"%d, %d, %d, %d\n", [o retainCount], [o1 retainCount], [o2
                                                                   retainCount], [array retainCount]);

作为我得到的输出:

[Session started at 2010-10-27 18:00:59 +0200.]
2010-10-27 18:01:02.186 Questions[22463:207] -------
2010-10-27 18:01:02.187 Questions[22463:207] 2, 2, 2, 1
2010-10-27 18:01:02.188 Questions[22463:207] 1, 1, 1, 1
2010-10-27 18:01:02.188 Questions[22463:207] -------

并且程序以EXC_BAD_ACCESS压缩。

我的问题如下: 据我所知,在调用[array release]之后,数组对象不再存在了,对吧?同样是为其他对象调用release,是吗?如果是这样,为什么我在调用[array retainCount]后没有得到EXC_BAD_ACCESS?为什么它会返回任何值?以及为什么在其他对象上调用retainCount会导致EXC_BAD_ACCESS?

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

好吧,正如您正确猜到的那样,您无法向已经发布的对象发送消息。如果您这样做的行为未指定,那么可能会引发EXC_BAD_ACCESS,但不一定是这样。

如果你想从已经发布的objets中获取retainCount,你应该查看NSZombieEnabledhttp://www.cocoadev.com/index.pl?NSZombieEnabled),这将导致对象被释放但不会被释放。< / p>

答案 1 :(得分:2)

因为您发布了array,然后又尝试再次访问它。

[array release]; // array is no longer in memory, therefore you can no longer use it.
[array retainCount]; // crash!

即使您在对象上调用release,有时该对象也可以在内存中停留一段时间。我建议你在释放它之后设置你可以重用到nil的任何变量。

[array release];
array = nil;
[array retainCount]; // no more crash