【问题标题】:Memory leak in using NSDictionary of NSDictionaries使用 NSDictionaries 的 NSDictionary 时的内存泄漏
【发布时间】:2011-06-10 12:35:32
【问题描述】:

我正在尝试解析 XML。我基本上有一个 NSMutableDictionary(比如 root),其中的元素是其他字典(比如 branch_1、branch_2、branch_3 等)。

在解析 XML 时,我为每个分支创建一个 NSMutableDictionary 并以这种方式向其中添加元素:

if ([elementName compare:@"branch_1"] == NSOrderedSame) 
{
    [root setObject:[[NSMutableDictionary alloc] init] forKey:@"branch_1"]; //Creating a new NSMutableDictionary            
} 

//Adding elements to the newly created NSMutabeDictionary 

if ([elementName compare:@"element_1"] == NSOrderedSame) 
{
   [[root objectForKey:@"branch_1"] setObject:someObject forKey:@"element_1"];                                      
} 

if ([elementName compare:@"element_2"] == NSOrderedSame) 
{
   [[root objectForKey:@"branch_1"] setObject:someObject forKey:@"element_2"];                                      
}

然后我最终在 dealloc 方法中释放我的根字典。然而,Xcode 中的分析工具在我为 branch_1 等创建新字典的行中显示了泄漏。

我猜我应该在发布根词典之前发布分支词典。但是,根字典的内容不应该在释放根本身时释放吗?

请告诉我如何修复此泄漏。任何帮助将不胜感激 !!

【问题讨论】:

    标签: iphone objective-c debugging memory-management memory-leaks


    【解决方案1】:

    问题是,您没有释放对新创建字典的引用。在

    [root setObject:[[NSMutableDictionary alloc] init] forKey:@"branch_1"];
    

    你根据

    创建了一个新字典
    [[NSMutableDictionary alloc] init]
    

    您的根字典将retain 该值。原始参考for which you are responsible 因为您使用alloc 获取它,所以在这里泄露。所以,试试

    [[[NSMutableDictionary alloc] init] autorelease]
    

    相反。

    编辑实现所需行为的另一种方法是使用类NSMutableDictionary定义的便利构造方法之一:

    [NSMutableDictionary dictionary]
    

    只要某人有(正确的retained)对它的引用,该对象就会保持活动状态。在这种情况下,您的根字典将保留新创建的子字典(setObject:forKey:retain 消息发送到值)。

    【讨论】:

    • …或[NSMutableDictionary dictionary]
    • @zoul: ...实际上会更短。谢谢。将编辑我的答案。
    • 这样做,对象不会被提前释放吗?我希望对象(在我的代码中由“someObject”表示)在整个应用程序期间一直存在。
    猜你喜欢
    • 2011-11-08
    • 2011-09-11
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2012-01-17
    • 2015-09-14
    • 2011-04-07
    相关资源
    最近更新 更多