【发布时间】:2008-12-01 17:11:08
【问题描述】:
在下面的代码中得到 objectEnumerator 后,set1 的保留计数变为 3。我很惊讶地看到它,因为我没想到它会改变。我搜了documentation,没找到解释这个效果的地方。
我假设额外的保留可能被 Cocoa 枚举逻辑设置为自动释放,并且在当前事件循环中不会真正产生任何影响。 objectEnumerator 逻辑需要对 set1 的引用是有道理的,但我想知道为什么要制作它们。原因如下:如果我假设 set1 在代码发布后保留计数为零,那么我可以尝试在另一个新集合中重用它。由于 set1 现在指向一个完全不同的对象/地址,这不会导致问题吗?
对于“奖励”点,有没有办法枚举自动释放池,看看它实际包含什么? TIA
#import <Foundation/NSObject.h>
#import <Foundation/NSSet.h>
#import <Foundation/NSValue.h>
#import <Foundation/NSEnumerator.h>
#import <Foundation/NSAutoreleasePool.h>
#import <Foundation/NSString.h>
#import <stdio.h>;
// macro to create an integer number:
#define INTOBJ(v) [NSNumber numberWithInt: v]
int main (int argc, char *argv[])
{
NSAutoreleasePool *pool = [NSAutoreleasePool new];
//Make set
NSMutableSet *set1 = [[NSMutableSet alloc] initWithObjects:
INTOBJ(1), INTOBJ(2), INTOBJ(5), INTOBJ(10), nil];
printf("set1 #%lu\n", [set1 retainCount]);
//Get enumerator of the set. This is where the retain count goes to 3:
NSEnumerator *setEnum = [set1 objectEnumerator];
printf("setEnum #%lu\n", [setEnum retainCount]);
printf("set1 #%lu\n", [set1 retainCount]);
//Iterate through the collection:
printf("[");
NSNumber *element;
while ((element = [setEnum nextObject]) != nil)
//do some this with item. printf is just for debugging:
printf(" %i ", [element intValue]);
printf("]\n");
printf("set1 #%lu\n", [set1 retainCount]);
[set1 release];
printf("set1 after release #%lu\n", [set1 retainCount]);
//More logic could go here reusing variable set1 since I assumed retain count = 0
[pool release];
return 0;
}
【问题讨论】:
标签: objective-c cocoa