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

6 memory-management objective-c

NSMutableDictionary使用该setValue:forKey:方法添加项目时(我认为这概括为任何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];
Run Code Online (Sandbox Code Playgroud)

显然,没有理由myInt在循环中释放它,dict因此它在代码结束之前无法释放.但是同样如此character吗?我的想法是,如果NSMutableDictionary以其他方式存储字符串,那么可以在循环周围创建一个临时池并释放这些字符串,而不是等到字典的发布.

我也很好奇,为什么retainCountcharacter是7FFFFFFF,就好像它是一个NSConstantString,我希望stringWithFormat返回一个NSString对象,它需要保留,但似乎并不如此.

Ale*_*lex 8

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

但是,无论NSMutableDictionary实际操作如何,您都不必担心是否character需要保留.一旦你把它NSMutableDictionary作为一个参数传递给它,确定如何存储数据真的是那个类的问题,除非文档特别告诉你保留对象是你的责任.

我也不会过分担心retainCount任何对象.在对象的保留计数过于紧密之后,可能会导致您跌落兔子洞,这会让您旋转车轮.

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