我有以下简单的代码:
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?
感谢您的帮助!
答案 0 :(得分:3)
好吧,正如您正确猜到的那样,您无法向已经发布的对象发送消息。如果您这样做的行为未指定,那么可能会引发EXC_BAD_ACCESS
,但不一定是这样。
如果你想从已经发布的objets中获取retainCount
,你应该查看NSZombieEnabled
(http://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