我有一个递归方法,它分配一个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;
}
即使我自动发布它,我仍然把它作为泄漏。这可能是误报吗?或者有什么不对劲我无法抓住?
答案 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传递给另一个方法,并且它没有自动释放。