【问题标题】:NSDictionary Memory leaksNSDictionary 内存泄漏
【发布时间】:2011-11-08 03:47:17
【问题描述】:

我实现了一个在我的应用程序中返回字典的方法。但是我使用仪器发现内存泄漏,我试图弄清楚,但我仍然找不到它。谁能帮帮我?

提前致谢,以下是该方法的代码:

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

我认为问题在于为 dict 分配内存而不是释放它。但在方法上,似乎我无法释放 dict。那么有什么方法可以修复泄漏吗?

【问题讨论】:

    标签: iphone memory-leaks nsdictionary


    【解决方案1】:

    我认为您只需将initDict 的最后一行更改为:

    return [dict autorelease];
    

    【讨论】:

    • +1 如果对象在同一范围内初始化但在 return 语句之前传递到其他地方,这很有用,并且它存在位于 NSAutoreleasePool 中的危险,即 drain ed,从而释放它。这不应该是个问题,因为自动释放池是堆叠起来的,以避免这种释放问题,但是我现在可能想不到一个边缘情况,你必须确保它是正确的retained.
    【解决方案2】:

    当您在函数中创建任何对象并且想要返回它们时,您应该始终以这些对象自动释放的方式创建它。所以你应该像下面这样改变你的代码。

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

    因此,每当您创建任何对象时,只需对其调用 autorelease 方法即可。

    【讨论】:

      【解决方案3】:

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

      替换

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

      与

      NSMutableDictionary *dict = [NSMutableDictionary dictionary];
      

      【讨论】:

      • dictionary] 是init] autorelease] 的同义词;您可能应该在显式 autorelease 调用之上使用此版本,因为该对象是在其返回/自动释放的同一范围内创建的,这是 dictionary] 初始化程序(临时对象)的预期用例。
      • 你已经解决了我 50 个内存泄漏中的最后一个,谢谢。我从来不知道这件事,我非常感谢你。我认为这需要大力支持。
      猜你喜欢
      • 2011-09-11
      • 2011-05-20
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多