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

Ram*_*Ram 2 iphone memory-leaks objective-c

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

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

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

spa*_*unt 9

根据" 内存管理编程指南",您应该release或至少autorelease是从中获得的任何引用alloc,new或者copy.

在你的情况下,尝试[userInput copy]改为[[userInput copy] autorelease]; 同样的placeholder.

编辑:请注意,默认NSDictionaryNSMutableDictionary类已经复制键并保留值 - 有关更多详细信息,请参阅"内存管理编程指南"以及NSMutableDictionary类参考.因此,没有必要[placeholder copy],如果你不打算创建一个单独的副本userInput,也没有必要copy.

  • 虽然你说'NSMutableDictionary`保留了添加到它的对象是正确的,但这与复制不同.如果您希望对象不受外部操作的影响,则必须复制它们. (4认同)
  • 实际上,NSDictionary对象已经**复制**键...(也就是说,关键对象必须符合`NSCopying`). (2认同)