在我的程序中,我尝试在字典中设置对象。值来自另一个类,因此我在处理它之前复制了这些值。
在分析代码时,我得到了泄漏。
-(void)giveInput:(NSString *)userInput ForPlaceholder:(NSString *)placeholder{
[inputValue setObject:[userInput copy] forKey:[placeholder copy]];
}
如何释放userINput和Placehoder对象保留计数?
答案 0 :(得分:9)
根据Memory Management Programming Guide,您应release
或至少autorelease
来自alloc
,new
或copy
的任何推荐。
在您的情况下,请尝试将[userInput copy]
更改为[[userInput copy] autorelease]
;同样适用于placeholder
。
编辑:
但请注意,默认的NSDictionary
和NSMutableDictionary
类已经复制了密钥并保留了值 - 有关详细信息,请参阅“内存管理编程指南”和the NSMutableDictionary class reference。因此,不需要[placeholder copy]
,如果您不打算创建userInput
的单独副本,则也不需要copy
。
答案 1 :(得分:2)
-(void)giveInput:(NSString *)userInput ForPlaceholder:(NSString *)placeholder{
NSString *cpUserInput = [userInput copy];
NSString *cpPlaceholder = [placeholder copy];
[inputValue setObject:cpUserInput forKey:cpPlaceholder];
[cpUserInput release];
[cpPlaceholder release];
}
或者使用自动释放的更少行:
[inputValue setObject:[[userInput copy] autorelease] forKey:[[placeholder copy] autorelease]];
将对象添加到词典/数组时,* 会保留
答案 2 :(得分:0)
复制对象时,您将获得副本的所有权。 setObject:forKey:
在添加对象之前保留对象;这意味着您已过度保留userInput
和placeholder
:它们永远不会被取消分配。要修复内存泄漏,请通过调用autorelease
来放弃对象的所有权。
[inputValue setObject:[[userInput copy] autorelease] forKey:[[placeholder copy] autorelease]];
我建议你阅读Apple的Memory Management Programming Guide。