[NSMutableDictionary setValue: value forKey: key] 是不是保留 NSString 键?

Posted

技术标签:

【中文标题】[NSMutableDictionary setValue: value forKey: key] 是不是保留 NSString 键?【英文标题】:Does [NSMutableDictionary setValue: value forKey: key] retain NSString key?[NSMutableDictionary setValue: value forKey: key] 是否保留 NSString 键? 【发布时间】: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 【参考方案1】:

在 Cocoa 中,NSString 参数被复制而不是保留是很常见的。那是因为你可以很容易地给字典一个NSMutableString 的实例。因为字符串的值可能会改变,NSDictionary 会进行复制。

但是,无论NSMutableDictionary 真正如何运作,您都不必担心character 是否需要保留。一旦你将它作为参数传递给NSMutableDictionary,那么决定如何存储数据的真正问题是该类的问题,除非文档明确告诉你保留对象是你的责任。

我也不会太担心任何对象的retainCount。过于密切地跟踪对象的保留计数可能会将您引向兔子洞,这只会让您旋转***。

最后,我真的认为您不需要在这里创建自己的自动释放池。除非您绝对确定 theString 会很长,或者您已经观察到 Instruments 中的内存利用率很高,否则添加自动释放池是不必要的优化。

【讨论】:

【参考方案2】:

你不需要在那里保留character,当你将它设置为键时字典会保留它,你自己的代码不需要保留它。

您也不必担心为什么保留计数不是您所期望的。可能 Foundation 框架具有类似 Flyweight 的实例,其中包含大量单字符 NSString 实例。无论如何,如果您按照指南正确地进行了内存管理,那么无论框架在幕后做什么,您都会没事的。 http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

【讨论】:

以上是关于[NSMutableDictionary setValue: value forKey: key] 是不是保留 NSString 键?的主要内容,如果未能解决你的问题,请参考以下文章

将 NSMutableDictionary 的键/值存储到另一个 NSMutableDictionary

两个NSMutableDictionary合并成一个NSMutableDictionary

如何将 NSArray 添加为 NSMutableDictionary 的 NSMutableDictionary 键?

如何获得 NSDictionary/NSMutableDictionary 的原始顺序?

类别 NSMutableDictionary/NSDictionary 应该返回 NSMutableDictionary/NSDictionary 取决于调用者类

如何更新 NSMutableDictionary?