gpt4 book ai didi

objective-c - 是否 [NSMutableDictionary setValue : value forKey: key] retain NSString key?

转载 作者:太空狗 更新时间:2023-10-30 03:41:15 24 4
gpt4 key购买 nike

当使用 setValue:forKey: 方法将项目添加到 NSMutableDictionary 时(我想这可以推广到任何 NSObject)字典是否保留了第二个参数,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 以某种其他方式存储字符串,那么可以在循环周围创建一个临时池并释放这些字符串,而不是等到字典释放。

我也很好奇为什么 characterretainCount 是 7fffffff 就好像它是一个 NSConstantString,我希望 stringWithFormat 返回一个需要保留的 NSString 对象,但事实并非如此。

最佳答案

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

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

我也不会太担心任何对象的 retainCount。过分关注对象的保留计数可能会使您掉入兔子洞,这只会让您转动轮子。

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

关于objective-c - 是否 [NSMutableDictionary setValue : value forKey: key] retain NSString key?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/671322/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com