[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 取决于调用者类