2011-09-01 54 views
0

我实现了一种方法来返回我的应用程序中的字典。但是我发现使用乐器存在内存泄漏,我试图找出它,但我仍然无法找到它。谁能帮我吗?提前NSDictionary内存泄漏

谢谢你,这里是该方法的代码:

-(NSMutableDictionary *)initDict 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 
    [dict setObject:self.name forKey:@"Name"]; 
    //Some similar set object for key here... 
    return dict; 
} 

我认为这个问题是从allocing的字典存储和不释放它。但在该方法中,似乎我无法释放字典。那么是否有任何方法来解决泄漏问题?

回答

2

所有变种都很好。这是第三个变种(明智的选择):

更换

NSMutableDictionary *dict = [[NSMutableDictionary alloc]init]; 

NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 
+0

'dictionary]'是'init] autorelease]的同义词;你应该在明确的'autorelease'调用之上使用这个版本,因为该对象是在它返回的/ autoreleased的相同范围内创建的,这是'dictionary]'initialiser(临时对象)的预期用例。 – darvids0n

+0

你已经解决了我的最后50个内存泄漏,谢谢。我从来不知道这一点,我非常感谢你。我认为这需要提高很多。 – Rob

1

我想你只需要改变的initDict这最后一行:

return [dict autorelease]; 
+0

+1如果对象是在同一范围内初始化,但在'返回之前在其他地方通过,这是有用'声明,并且存在''漏''NSAutoreleasePool'中的危险,从而将其解除分配。这*不应该成为问题,因为自动释放池被堆叠起来以避免这种释放问题,但是现在可能有一个边缘情况,现在我不能想到你必须确保它正确地被“保留”。 – darvids0n

0

当你创建你的函数的任何对象,并要回报他们,那么你应该总是以一种方式创建那些对象是自动释放的。所以你应该像下面那样改变你的代码。

NSMutableDictionary *dict = [[[NSMutableDictionary alloc]init]autorelease]; 

因此,无论何时创建任何对象,只需调用autorelease方法即可。