【发布时间】:2009-03-22 17:22:22
【问题描述】:
当使用setValue:forKey: 方法(我想这可以推广到任何NSObject)向NSMutableDictionary 添加项目时,字典是否保留第二个参数NSString?
例如:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
NSString *theString = @"hello";
int i;
for (i=0; i<[theString length]; i++){
NSNumber *myInt = [NSNumber numberWithInt:i];
NSString *character = [NSString stringWithFormat:@"%C",[theString characterAtIndex:i]];
[dict setValue: myInt forKey:character];
}
[dict release];
[pool release];
显然,没有理由在循环中释放myInt,它由dict 保留,所以直到代码结束才能释放。但是character 也一样吗?我的想法是,如果NSMutableDictionary 以其他方式存储字符串,那么可以在循环周围创建一个临时池并释放这些字符串,而不是等到字典释放。
我也很好奇为什么character 中的retainCount 是7fffffff,就好像它是NSConstantString,我希望stringWithFormat 返回一个需要保留的NSString 对象,但事实并非如此'似乎并非如此。
【问题讨论】:
-
只是一个不值得回答的好点:在 10.4 及更高版本的代码中,通常最好使用 [pool drain] 代替——当 GC 开启时,drain 会提示它 可能是收集旧引用的好时机,而发布则成为空操作。关闭 GC 后,它们的功能相同。
-
这是一个老问题,但您可能打算改用
setObject:forKey:。 see here
标签: objective-c memory-management