Objective C - 将数组设置为字典对象时出现泄漏

时间:2012-01-13 10:00:33

标签: objective-c memory-leaks nsmutablearray nsmutabledictionary

我写了一个类,它充当过滤器。我传递了三个对象:

  1. 一个NSArray,它保存要过滤的对象(这些对象具有时间戳属性)
  2. NSMutableArray(将保存tableView的节名称,基于时间戳的句点)。我需要这个数组,因为我必须对句点进行排序。
  3. 一个NSMutableDictionary,其中键是节名,值是NSMutableArrays,它们保存给定时间段的项目。
  4. 在我传递这些对象的类中,有一个tableView,我在其中显示这些项。 这个类有自己的NSMutableArray和NSMutableDictionary,我没有初始化它们,只保留过滤器类的相应返回值。在delloc方法中,我释放它们。过滤器类中有一个方法:

    + (void)insertItem:(id)item forPeriod:(NSString *)period toContainer:(NSMutableDictionary *)container {
    
        if ( ![[container allKeys] containsObject:period] ) {
    
            // the period isn't stored, create and store it
            NSMutableArray *periodArray = [[NSMutableArray alloc] init];
            [container setObject:periodArray forKey:period];
            [periodArray release];
            periodArray = nil;
       }
    
       // store the item
       NSMutableArray *arrayForPeriod = [container objectForKey:period];
       [arrayForPeriod addObject:item];
       arrayForPeriod = nil;
    }
    

    当我将新分配的数组设置为字典的对象时,仪器显示泄漏。在这一点上这肯定是正确的,因为字典再次保留了数组,所以在发布之后,它保留计数仍为1.但我认为在调用者类中,当我发布字典时,数组也将被释放。我错了吗?

2 个答案:

答案 0 :(得分:0)

是的,它被认为是泄漏,因为你的var是一个局部变量。然后你仍然在内存中有一个对象,但没有引用它。请记住init生成一个retain +保留由dictionary = 2保留。只需使用

创建阵列即可
  

NSMutableArray * periodArray = [[[NSMutableArray alloc] init]   自动释放]

是否清楚?

答案 1 :(得分:0)

您可以切换到ARC。或者,检查静态分析器对您的代码的看法。它很擅长发现内存泄漏,比大多数人更好。

一旦你的词典中有几百个对象,就会浪费大量的时间和内存。字典没有隐藏在某处的所有键的数组,每次调用方法时都必须创建它。那是复制几百个指针(便宜)并保留它们(昂贵)。用于数组的containsObject将对象与调用isEqual的数组中的每个对象进行比较:这很昂贵。这是每次NSString比较。该阵列是自动释放的,当它最终消失时,它中的所有键都被释放。又贵了。

NSDictionary使用哈希表,因此[objectForKey]将立即转到正确的对象。一次操作而不是数百次。