NSMutableArray在递归方法中泄漏内存

时间:2011-04-27 19:10:44

标签: iphone objective-c ios

我有一个递归方法,它分配一个NSMutableArray,运行一个递归调用,然后释放NSMutableArray。该方法采用数字和目标值的数组,然后找出这些数字的哪些组合可以求和等于目标值,例如目标:10,数字:5,5,4。该方法返回NSNumbers 5和5的数组。

我的问题是,即使我正在释放它,一个可变数组总是在泄漏工具中显示为泄漏。

这是递归方法:

-(NSMutableArray *) getCombsHelper:(NSArray *)numbers target:(int)target partial:(NSMutableArray *)partial {

    int s = 0;
    for (NSNumber *number in partial) {
        s += [number intValue];
    }

    if (s == target)  
        [results addObject:partial];


    if (s >= target) 
        return results;


    for (int i = 0; i < [numbers count]; i++) {

        NSMutableArray *remaining = [[[NSMutableArray alloc] init] autorelease];
        int n = [[numbers objectAtIndex:i] intValue];
        for (int j = i+1; j<[numbers count]; j++) {
            [remaining addObject:[numbers objectAtIndex:j]];
        }

        //this is the array that is showing up as a leak.
        NSMutableArray *partialRec = [[NSMutableArray alloc] initWithArray:partial]; 

        [partialRec addObject:[NSNumber numberWithInt:n]];

        [self getCombsHelper:remaining target:target partial:partialRec];
        [partialRec release]; //the mutable array is released after the recursive call.
    }

    return results;

}

即使我自动发布它,我仍然把它作为泄漏。这可能是误报吗?或者有什么不对劲我无法抓住?

3 个答案:

答案 0 :(得分:2)

那个方法很奇怪;

  • results似乎是一个累积结果的实例变量?这通常很奇怪;通常,你会有一些东西可以计算出一个ivar和一个检索ivar的普通访问器。

要扩展:与直接getter方法相比,您的递归方法相对昂贵。假设你需要在三个地方results;如果这种递归方法是检索results的唯一方法,那么每次调用都会产生计算开销。相反,如果你有类似的东西:

- (void)combsHelper:...

- (NSArray*) results
{
    return results;
}

然后你可以进行一次计算并多次检索结果而不会产生开销(虽然你可以在你的getter中做if (!results) [self combsHelper:...]这样的事情,这会导致getter导致状态突变,这通常是要避免 - 最好把两者分开。)

  • 不要命名方法getSomething:...; get作为前缀仅限于非常具体的使用模式(通常,通过引用传递值的值 - 不常见)..

什么阵列泄漏?请记住,Instruments会向您显示泄漏的分配点,而不是实际泄漏发生的位置。如果有什么东西将物体保留在其他地方没有平衡释放,那就是你的泄漏。

泄漏不在此方法之内; partialRec数组已添加results。有些东西可能是从所述阵列中检索它,保留它,而不是用发布版本来平衡它

答案 1 :(得分:1)

也许抱怨是你将partialRec传递给方法,然后将它添加到你返回的数组(结果)中,但是你没有捕获你的返回值。

将其添加到数组中将保留它。

“结果”来自哪里?我没有看到它的声明。

答案 2 :(得分:-1)

你可能在这一行有问题:

[self getCombsHelper:remaining target:target partial:partialRec];

您正在将partialRec传递给另一个方法,并且它没有自动释放。