当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];
显然,没有理由myInt
在循环中释放它,dict
因此它在代码结束之前无法释放.但是同样如此character
吗?我的想法是,如果NSMutableDictionary
以其他方式存储字符串,那么可以在循环周围创建一个临时池并释放这些字符串,而不是等到字典的发布.
我也很好奇,为什么retainCount
的character
是7FFFFFFF,就好像它是一个NSConstantString
,我希望stringWithFormat
返回一个NSString
对象,它需要保留,但似乎并不如此.
在Cocoa中NSString
,要复制参数而不是保留参数是很常见的.那是因为你可以很容易地给字典一个实例NSMutableString
.因为字符串的值可能会更改,NSDictionary
所以复制.
但是,无论NSMutableDictionary
实际操作如何,您都不必担心是否character
需要保留.一旦你把它NSMutableDictionary
作为一个参数传递给它,确定如何存储数据真的是那个类的问题,除非文档特别告诉你保留对象是你的责任.
我也不会过分担心retainCount
任何对象.在对象的保留计数过于紧密之后,可能会导致您跌落兔子洞,这会让您旋转车轮.
最后,我真的认为你不需要在这里创建自己的自动释放池.除非你绝对肯定地知道这theString
将会很长,或者你已经观察到仪器中的高内存利用率,否则添加自动释放池是不必要的优化.