如何在iOS程序中释放使用copy关键字的对象

时间:2011-06-05 11:28:50

标签: iphone objective-c memory-leaks

在我的程序中,我尝试在字典中设置对象。值来自另一个类,因此我在处理它之前复制了这些值。

在分析代码时,我得到了泄漏。

-(void)giveInput:(NSString *)userInput ForPlaceholder:(NSString *)placeholder{

    [inputValue setObject:[userInput copy] forKey:[placeholder copy]];

}

如何释放userINput和Placehoder对象保留计数?

3 个答案:

答案 0 :(得分:9)

根据Memory Management Programming Guide,您应release或至少autorelease来自allocnewcopy的任何推荐。

在您的情况下,请尝试将[userInput copy]更改为[[userInput copy] autorelease];同样适用于placeholder

编辑: 但请注意,默认的NSDictionaryNSMutableDictionary类已经复制了密钥并保留了值 - 有关详细信息,请参阅“内存管理编程指南”和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:在添加对象之前保留对象;这意味着您已过度保留userInputplaceholder:它们永远不会被取消分配。要修复内存泄漏,请通过调用autorelease来放弃对象的所有权。

[inputValue setObject:[[userInput copy] autorelease] forKey:[[placeholder copy] autorelease]];

我建议你阅读Apple的Memory Management Programming Guide